如果你在尋找python工作,那你的面試可能會涉及Python相關的問題。
通過對網絡資料的收集整理,本文列出了100道python的面試題以及答案,你可以根據需求閱讀測試。
python基礎
Q1.什麼是Python?
Python是一種面向對象的,交互式的,解釋型的計算機程序設計語言。Python的設計具有高可讀性,它使用英語關鍵詞而非標點符號,語法結構也比其他語言簡單。
Q2.Python的主要功能是什麼?
1)python是一種解釋型語言,因此在使用python時不需要進行編譯
2)聲明變量和類似變量時,不需要重複聲明變量的類型;
3)Python非常適合面向對象的編程,因爲它允許類的定義以及組合和繼承;
4)函數是第一類對象,這意味着它們可以分配給變量,從其他函數返回並傳遞給函數,類也是第一類對象;
5)用於許多領域,包括Web應用程序,自動化,科學建模,大數據應用程序等等。
Q3.Python中支持的數據類型有哪些?
Python支持5種數據類型:
1)Numbers(數字)——用於保存數值;
a=7.0
2)Strings(字符串)——字符串是一個字符序列,我們用單引號或雙引號來聲明字符串;
title="Data123"
3)Lists(列表)——列表就是一些值的有序集合,我們用方括號聲明列表;
colors=['red','green','blue']
type(colors)
<class 'list'>
4)tuples(元組)——元組和列表一樣,也是一些值的有序集合,區別是元組是不可變的,意味着我們無法改變元組內的值。
(1,2,3,abc)
5)Dictionary(字典)——字典(dictionary)是除列表以外Python之中最靈活的內置數據結構類型。
列表是有序的對象結合,字典是無序的對象集合。
兩者之間的區別在於:字典當中的元素是通過鍵來存取的,而不是通過偏移存取。
字典用"{ }"標識。字典由索引(key)和它對應的值value組成。
dict = {}
dict['one'] = 'This is one'
dict[2] = 'This is two'
tinydict = {'name':'john','code':5762,'dept':'sales'}
print(dict['one']) #輸出鍵爲'one'的值
print(dict[2]) #輸出鍵爲2的值
print(tinydict) #輸出完整的字典
print(tinydict.keys()) #輸出所有鍵
print(tinydict.values()) #輸出所有值
Q4.列表和元組有什麼區別?
Q5.什麼是Python模塊?
模塊是一個Python腳本,通常包含import語句,函數,類和變量定義,以及Python可運行代碼,文件的擴展名爲“.py”。
Q6.python解釋器種類以及特點?
CPython:這個解釋器是用C語言開發的,所以叫 CPython,在命名行下運行python,就是啓動CPython解釋器,CPython是使用最廣的Python解釋器;
IPython:IPython是基於CPython之上的一個交互式解釋器,也就是說,IPython只是在交互方式上有所增強;
PyPy:PyPy是另一個Python解釋器,它的目標是執行速度,PyPy採用JIT技術,對Python代進行動態編譯,所以可以顯著提高Python代碼的執行速度;
Jython:Jython是運行在Java平臺上的Python解釋器,可以直接把Python代碼編譯成Java字節碼執行。
IronPython:IronPython和Jython類似,只不過IronPython是運行在微軟.Net平臺上的Python解釋器,可以直接把Python代碼編譯成.Net的字節碼。
Q7.什麼是Python切片?
Python中符合序列的有序序列都支持切片(slice),如:列表,字符,元祖
Python中切片的格式:[start : end : step]
Start:起始索引,從0開始,-1表示結束;End:結束索引;Step:步長
end-start=正數時,從左向右取值,=負數時反向取值
注意:切片結果不包含結束索引,即不包含最後一位,-1代表最後一個位置索引
str1 = 'abcdefghijklmnopqrstuvwxyz'
str1[2:6]
'cdef'
Q8.Python中的%S是什麼?
Python支持將值格式化爲字符串。雖然這可以包括非常複雜的表達式,但最基本的用法是將值插入到%s 佔位符的字符串中 。
name = raw_input("who are you?")
print "hello %s" % (name,)
Q9.Python編程中的函數是什麼?
函數是表示代碼塊並且是可重用實體的對象。
它爲程序帶來了模塊化,並提供了更高程度的代碼可重用性。
Python爲我們提供了許多內置函數,例如print()等,並提供了創建用戶定義函數的能力。
Q10.Python中有多少基本類型的函數可用?
Python爲我們提供了兩種基本類型的函數:內置和用戶定義。
內置函數是Python語言的一部分,比如print(),dir(),len()和abs()等。
Q11.我們如何用Python編寫函數?
我們可以通過以下方式創建Python函數。
1)用def定義函數並鏈接功能名稱;
2)傳遞參數並使用括號將它們括起來,使用冒號來表示結尾;
3)添加所需的Python語句以供執行。
Q12.深拷貝和淺拷貝有什麼區別?
深拷貝就是將一個對象拷貝到另一個對象中,這意味着如果你對一個對象的拷貝做出改變時,不會影響原對象。
在Python中,我們使用函數deepcopy()執行深拷貝,導入模塊copy,如下所示:
import copy
b=copy.deepcopy(a)
而淺拷貝則是將一個對象的引用拷貝到另一個對象上,所以如果我們在拷貝中改動,會影響到原對象。我們使用函數function()執行淺拷貝,使用如下所示:
b=copy.copy(a)
Q13.Python中的函數調用或可調用對象是什麼?
Python中的函數被視爲可調用對象。它可以允許一些參數,並以元組的形式返回一個值或多個值。除了函數之外,Python還有其他構造,例如類或適合同一類別的類實例。
Q14.Python中Pass和Continue有什麼區別?
continue語句使循環從下一次迭代中恢復。pass語句指示什麼都不做,代碼的其餘部分像往常一樣執行。
Q15. PYTHONPATH環境變量的目的是什麼?
PYTHONPATH - 它的作用類似於PATH。此變量告訴Python解釋器在何處找到導入程序的模塊文件。它應該包括Python源庫目錄和包含Python源代碼的目錄。PYTHONPATH有時由Python安裝程序預設。
Q16.PYTHONSTARTUP,PYTHONCASEOK,PYTHONHOME,PYTHONSTARTUP環境變量的目的是什麼?
PYTHONSTARTUP - 它包含一個包含Python源代碼的初始化文件的路徑。每次啓動解釋器時都會執行它。它在Unix中命名爲.pythonrc.py,它包含加載實用程序或修改PYTHONPATH的命令。
PYTHONCASEOK - 在Windows中用於指示Python在import語句中查找第一個不區分大小寫的匹配項。將此變量設置爲任何值以激活它。
PYTHONHOME - 它是另一種模塊搜索路徑。它通常嵌入在PYTHONSTARTUP或PYTHONPATH目錄中,以便於切換模塊庫。
Q17.如何在Python中實現多線程?
python主要是通過thread和threading這兩個模塊來實現多線程支持。
python的thread模塊是比較底層的模塊,python的threading模塊是對thread做了一些封裝,可以更加方便的被使用。但是python(cpython)由於GIL的存在無法使用threading充分利用CPU資源,如果想充分發揮多核CPU的計算能力需要使用multiprocessing模塊(Windows下使用會有諸多問題)。
python3.x中已經摒棄了Python2.x中採用函數式thread模塊中的start_new_thread()函數來產生新線程方式。python3.x中通過threading模塊創建新的線程有兩種方法:
1)通過threading.Thread(Target=executable Method)-即傳遞給Thread對象一個可執行方法(或對象)
2)繼承threading.Thread定義子類並重寫run()方法。第二種方法中,唯一必須重寫的方法是run()。
Q18.如何在python中使用三元運算符?
Ternary運算符是用於顯示條件語句的運算符。這包含true或false值,並且必須爲其評估語句。
三元運算符將被給出爲:
[on_true] if [expression] else [on_false] x,y = 25,50big =x if x <y else y
表達式的計算方式與x <y else y一樣,在這種情況下,如果x <y爲真,則返回值爲big = x,如果不正確則返回big = y作爲結果。
Q19.什麼是Tkinter ?
TKinter是一款很知名的Python庫,用它我們可以製作圖形用戶界面。其支持不同的GUI工具和窗口構件,比如按鈕、標籤、文本框等等。這些工具和構件均有不同的屬性,比如維度、顏色、字體等。
Q20.Python中的繼承
繼承允許一個類獲得另一個類的所有成員(比如屬性和方法)。繼承提供代碼可重用性,使創建和維護應用程序更容易。
Python支持的不同類型的繼承:
1)單一繼承 - 派生類獲取單個超類的成員;
2)多級繼承 - 從基類base1繼承的派生類d1,d2繼承自base2;
3)分層繼承 - 從一個基類可以繼承任意數量的子類;
4)多重繼承 - 派生類從多個基類繼承。
Q21.請談談.pyc文件和.py文件的不同之處
雖然這兩種文件均保存字節代碼,但.pyc文件是Python文件的編譯版本,它有平臺無關的字節代碼,因此我們可以在任何支持.pyc格式文件的平臺上執行它。
Q22.什麼是酸洗和去除?
Pickle模塊接受任何Python對象並將其轉換爲字符串表示形式,並使用dump函數將其轉儲到文件中,此過程稱爲pickling。從存儲的字符串表示中檢索原始Python對象的過程稱爲unpickling。
Q23.在Python中命名與文件相關的模塊?
Python爲庫/模塊提供了一些函數,你可以在文件系統上操作文本文件和二進制文件。使用它們完成創建文件,更新內容,複製和刪除文件的操作。這些庫是:os,os.path和shutil。
Q24.解釋使用with聲明?
在python中,通常“with”語句用於打開文件,處理文件中存在的數據,還可以在不調用close()方法的情況下關閉文件。
Q25.解釋Python支持的所有文件處理模式?
Python中可以使用三種方法打開文件。他們是:
1)通過分別指定標誌“r”,“w”,“rw”,“a”,只讀模式,只寫模式,讀寫模式和附加模式;
2)通過指定選項“t”,可以在上述任何一種模式中打開文本文件;
3)“r”,“w”,“rw”和“a”,以便前面的模式變爲“rt”,“wt”,“rwt”和“at”。二進制文件可以在任何一箇中打開上述模式通過指定選項“b”以及“r”,“w”,“rw”和“a”使得前面的模式爲“rb”,“wb”,“rwb”,“ab”。
Q26. Python支持多少種序列?
Python支持7種序列類型。它們是str,list,tuple,unicode,byte array,xrange和buffer。其中xrange在python 3.5.X中已棄用。
Q27.如何在Python中執行模式匹配?
正則表達式(RE)使我們能夠指定匹配給定字符串的特定“部分”的表達式。例如,我們可以定義一個正則表達式來匹配單個字符或數字,電話號碼或電子郵件地址等.Python的“re”模塊提供正則表達式模式,並從Python 2.5的更高版本中引入。“re”模塊提供搜索文本字符串的方法,或者替換文本字符串以及基於定義的模式拆分文本字符串的方法。
Q28.Python如何處理內存管理?
Python內存由Python私有堆空間管理。所有Python對象和數據結構都位於私有堆中。程序員無權訪問此私有堆,解釋器負責處理此私有堆。Python對象的Python堆空間分配由Python內存管理器完成。核心API提供了一些程序員編寫代碼的工具。Python還有一個內置的垃圾收集器,它可以回收所有未使用的內存並釋放內存並使其可用於堆空間。
Q29.如何以相反的順序顯示文本文件的內容?
1)將給定文件轉換爲列表
2)使用reverse()反轉列表例如:
for reverse in reverse(list(open(“file-name”,“r”))):
print()
Q30.什麼是負索引
Python序列可以是正數和負數的索引。對於正索引,0是第一個索引,1是第二個索引,依此類推。對於負索引,( - 1)是最後一個索引,( - 2)是倒數第二個索引,依此類推。
Q31.解釋Python中“re”模塊的split(),sub(),subn()方法。
爲了修改字符串,Python的“re”模塊提供了3種方法。
1)split() - 使用正則表達式模式將給定字符串“拆分”到列表中;
2)sub() - 查找正則表達式模式匹配的所有子字符串,然後用不同的字符串替換它們;
3)subn() - 它類似於sub(),並且還返回新字符串和no。替換。
Q32.解釋Python Flask中的數據庫連接
Flask支持數據庫驅動的應用程序(RDBS)。Flask允許以三種方式請求數據庫
1)before_request():在請求之前調用它們並且不傳遞任何參數
2)after_request():在請求後調用它們並傳遞將發送到客戶端的響應
3)teardown_request():在引發異常時調用它們,並且不保證響應。它們在響應構建後被調用。不允許他們修改請求,並忽略它們的值。
Q33. range和xrange有什麼區別?
在大多數情況下,xrange和range在功能方面完全相同,它們都提供了一種生成整數列表的方法。唯一的區別是range返回一個Python列表對象,x range返回一個xrange對象。
Q34.Python中的“按值調用”是什麼?
在call-by-value中,表達式或值是否綁定到函數中的相應變量的參數。Python會將該變量視爲函數級範圍中的本地變量。對該變量所做的任何更改都將保留在本地,並且不會反映在該函數之外。
Q35.什麼是Python中的“按引用調用”?
我們可以互換地使用“引用調用”和“引用傳遞”。當我們通過引用傳遞參數時,它可以作爲函數的隱式引用,而不是簡單的副本。在這種情況下,對參數的任何修改也將對調用者可見。
該方案還具有帶來更多時間和空間效率的優點,因爲它留下了創建本地副本的需要。相反,缺點可能是函數調用期間變量可能會意外更改。
Q36.Lambda和Def之間的主要區別是什麼?
當lambda是uni-expression函數時,Def可以包含多個表達式。Def生成一個函數並指定一個名稱以便稍後調用它。Lambda形成一個函數對象並返回。Def可以有一個return語句。Lambda不能有return語句。Lambda支持在列表和字典中使用。
Q37.ascii、unicode、utf-8、gbk 區別?
ASCII碼:使用一個字節編碼,所以它的範圍基本是隻有英文字母、數字和一些特殊符號 ,只有256個字符;
Unicode:能夠表示全世界所有的字節;
GBK:是隻用來編碼漢字的,GBK全稱《漢字內碼擴展規範》,使用雙字節編碼;
UTF-8:是一種針對Unicode的可變長度字符編碼,又稱萬國碼。
Q38.每當Python退出時,爲什麼不是所有的內存都被解除分配?
每當python退出時,尤其是那些對其他對象具有循環引用的Python模塊或者從全局名稱空間引用的對象並不總是被解除分配或釋放。由於python擁有自己的高效清理機制,無法解除分配保留的那些內存部分會在退出時嘗試取消分配/銷燬其他所有對象。
Q 39.解釋Python的參數傳遞機制
Python使用按引用傳遞(pass-by-reference)將參數傳遞到函數中。如果你改變一個函數內的參數,會影響到函數的調用。這是Python的默認操作。不過,如果我們傳遞字面參數,比如字符串、數字或元組,它們是按值傳遞,這是因爲它們是不可變的。
Q40.什麼是猴子補丁?
在運行期間動態修改一個類或模塊。
class A:
def func(self):
print("Hi")
def monkey(self):
print "Hi, monkey"
m.A.func = monkey
a = m.A()
a.func()
Hi, Monkey
Q41.大數據的文件讀取
1)利用生成器generator
2)迭代器進行迭代遍歷:for line in file
Q42.find和grep
grep命令是一種強大的文本搜索工具,grep搜索內容串可以是正則表達式,允許對文本文件進行模式查找。如果找到匹配模式,grep打印包含模式的所有行。find通常用來再特定的目錄下搜索符合條件的文件,也可以用來搜索特定用戶屬主的文件。
Q43.線上服務可能因爲種種原因導致掛掉怎麼辦?
linux下的後臺進程管理利器 supervisor
每次文件修改後再linux執行 service supervisord restart
Q44.如何提高python的運行效率
使用生成器;關鍵代碼使用外部功能包(Cython,pylnlne,pypy,pyrex);針對循環的優化--儘量避免在循環中訪問變量的屬性
Q45.常用Linux命令
ls,help,cd,more,clear,mkdir,pwd,rm,grep,find,mv,su,date
Q46.Python中的yield用法
yield簡單說來就是一個生成器,這樣函數它記住上次返 回時在函數體中的位置。對生成器第 二次(或n 次)調用跳轉至該函 次)調用跳轉至該函數。
Q47.描述數組、鏈表、隊列、堆棧的區別?
數組與鏈表是數據存儲方式的概念,數組在連續的空間中存儲數據,而鏈表可以在非連續的空間中存儲數據;隊列和堆棧是描述數據存取方式的概念,隊列是先進先出,而堆棧是後進先出;隊列和堆棧可以用數組來實現,也可以用鏈表實現。
Q48.如何使用我已經知道的URL地址本地保存圖像?
將使用以下代碼從URL地址本地保存圖像:
import urllib.request
urllib.request.urlretrieve("URL", "local-filename.jpg")
Q49.如何獲取任何網址或網頁的Google緩存時限?
使用以下URL格式:
http://webcache.googleusercontent.com/search?q=cache:URLGOESHERE請務必將“URLGOESHERE”替換爲您要檢索其緩存的頁面或網站的正確網址,並查看時間。
例如,要查看http://edureka.co的Google Webcache時代,您需要使用以下網址:
http://webcache.googleusercontent.com/search?q=cache:edureka.co
Q50.您需要從IMDb前250電影頁面中刪除數據,只有字段電影名稱,年份和評級
from bs4 import BeautifulSoup
import requests
import sys
url ='http://www.imdb.com/chart/top'
response =requests.get(url)
soup =BeautifulSoup(response.text)
tr =soup.findChildren("tr")
tr =iter(tr)
next(tr)
formovie intr:
title =movie.find('td', {'class': 'titleColumn'} ).find('a').contents[0]
year =movie.find('td', {'class': 'titleColumn'} ).find('span', {'class': 'secondaryInfo'}).contents[0]
rating =movie.find('td', {'class': 'ratingColumn imdbRating'} ).find('strong').contents[0]
row =title +' - '+year +' '+' '+rating
print(row)
上述代碼將有助於從IMDb的前250名列表中刪除數據。
Q51.請解釋使用*args和*kwargs的含義
當我們不知道向函數傳遞多少參數時,比如我們向傳遞一個列表或元組,我們就使用*args:
def func(*args):
for i in args:
print(i)
func(3,2,1,4,7)
3
2
1
4
7
在我們不知道該傳遞多少關鍵字參數時,使用**kwargs來收集關鍵字參數:
def func(**kwargs):
for i in kwargs:
print(i,kwargs[i])
func(a=1,b=2,c=7)
a.1
b.2
c.7
Q52.如何在Python中刪除文件?
使用命令os.remove(filename)或os.unlink(filename)
Q53.解釋如何從C訪問用Python編寫的模塊?
您可以通過以下方法訪問C中用Python編寫的模塊:
Module = = PyImport_ImportModule(“<modulename>”)
Q54.在Python中使用//運算符?
它是一個Floor Divisionoperator,用於分割兩個操作數,結果爲商,只顯示小數點前的數字。例如,10 // 5 = 2和10.0 // 5.0 = 2.0。
Q55.怎麼移除一個字符串中的前導空格?
字符串中的前導空格就是出現在字符串中第一個非空格字符前的空格。我們使用方法Istrip()可以將它從字符串中移除。
' Data123 '.lstrip()
結果:
'Data123 '
最初的字符串當中既有前導字符也有後綴字符,調用Istrip()去除了前導空格,如果我們想去除後綴空格,可以使用rstrip()方法。
'Data123 '.rstrip()
'Data123'
Q56.如何用Python輸出一個Fibonacci數列?
a,b = 0, 1
while b<100:
print (b)
a, b = b, a+b
Q57.在Python中怎樣將字符串轉換爲整型變量?
如果字符串只含有數字字符,可以用函數int()將其轉換爲整數。
int('22')
我們檢查一下變量類型:
type('22')
<class'str'>
type(int('22'))
<class'int'>
Q58.在Python中如何生成一個隨機數?
要想生成隨機數,我們可以從random模塊中導入函數random()。
from random import random
random()
0.013501571090371978
我們還可以使用函數randint(),它會用兩個參數表示一個區間,返回該區間內的一個隨機整數。
from random import randint
randint(2,7)
4
Q59.怎樣將字符串中第一個字母大寫?
最簡單的方法就是用capitalize()方法。
'daxie'.capitalize()
'Daxie'
Q60.如何檢查字符串中所有的字符都爲字母數字?
對於這個問題,我們可以使用isalnum()方法。
'DATA123'.isalnum()
True
'DATA123!'.isalnum()
False
我們還可以用其它一些方法:
'123'.isdigit()#檢測字符串是否只由數字組成
True
'123'.isnumeric()#只針對unicode對象
True
'data'.islower()#是否都爲小寫
True
'Data'.isupper()#是否都爲大寫
False
Q61.什麼是Python中的連接(concatenation)?
Python中的連接就是將兩個序列連在一起,我們使用+運算符完成:
'22'+'33'
‘2233’
[1,2,3]+[4,5,6]
[1, 2,3, 4, 5, 6]
(2,3)+(4)
TypeError Traceback (most recent call last)
<ipython-input-7-69a1660f2fc5> in <module>
----> 1 (2,3)+(4)
TypeError: can only concatenate tuple (not "int") to tuple
這裏運行出錯,因爲(4)被看作是一個整數,修改一下再重新運行:
(2,3)+(4,)
(2, 3,4)
Q62.什麼是遞歸?
在調用一個函數的過程中,直接或間接地調用了函數本身這個就叫遞歸。但爲了避免出現死循環,必須要有一個結束條件,舉個例子:
def facto(n):
if n==1: return 1
return n*facto(n-1)
facto(5)
120
Q63.什麼是生成器?
生成器會生成一系列的值用於迭代,這樣看它又是一種可迭代對象。它是在for循環的過程中不斷計算出下一個元素,並在適當的條件結束for循環。我們定義一個能逐個“yield”值的函數,然後用一個for循環來迭代它。
def squares(n):
i=1
while(i<=n):
yield i**2
i+=1
for i in squares(5):
print(i)
1
4
9
16
25
Q64.什麼是迭代器?
迭代器是訪問集合元素的一種方式。迭代器對象從集合的第一個元素開始訪問,直到所有的元素被訪問完結束。迭代器只能往前不會後退。我們使用inter()函數創建迭代器。
odds=iter([1,2,3,4,5])
#每次想獲取一個對象時,我們就調用next()函數
next (odds)
1
next (odds)
2
next (odds)
3
next (odds)
4
next (odds)
5
Q65.請說說生成器和迭代器之間的區別
1)在使用生成器時,我們創建一個函數;在使用迭代器時,我們使用內置函數iter()和next();
2)在生成器中,我們使用關鍵字‘yield’來每次生成/返回一個對象;
3)生成器中有多少‘yield’語句,你可以自定義;
4)每次‘yield’暫停循環時,生成器會保存本地變量的狀態。而迭代器並不會使用局部變量,它只需要一個可迭代對象進行迭代;
5)使用類可以實現你自己的迭代器,但無法實現生成器;
6)生成器運行速度快,語法簡潔,更簡單;
7)迭代器更能節約內存。
Q66.函數zip()的是幹嘛的?
Python新手可能對這個函數不是很熟悉,zip()可以返回元組的迭代器。
list(zip(['a','b','c'],[1,2,3]))
[(‘a’,1), (‘b’, 2), (‘c’, 3)]
在這裏zip()函數對兩個列表中的數據項進行了配對,並用它們創建了元組。
Q67.如何用Python找出你目前在哪個目錄?
我們可以使用函數/方法getcwd(),從模塊os中將其導入。
import os
os.getcwd()
'C:\\Users\\37410\\Desktop\\代碼'
Q68.如何計算一個字符串的長度?
這個也比較簡單,在我們想計算長度的字符串上調用函數len()即可。
len('Data 123')
8
Q69.如何從列表中刪除最後一個對象?
從列表中刪除並返回最後一個對象或obj。
list.pop(obj = list [-1])
Q70.解釋一些在Python中實現面向功能的編程的方法
有時,當我們想要遍歷列表時,一些方法會派上用場。
1)filter()
過濾器允許我們根據條件邏輯過濾一些值。
list(filter(lambda x:x> 5,range(8)))
[6,7]
2)map()
Map將函數應用於iterable中的每個元素。
list(map(lambda x:x ** 2,range(8)))
[0,1,4,9,16,25,36,49]
3)reduce()
在我們達到單個值之前,Reduce會反覆減少序列順序。
from functools import reduce
reduce(lambda x,y:xy,[1,2,3,4,5])
-13
Q71.編寫一個Python程序來計算數字列表的總和
def list_sum(num_List):如果len(num_List)== 1:
return num_List [0]
else:
return num_List [0] + list_sum(num_List [1:])
print(list_sum([3,4,5,6,11]))
29
Q72.編寫一個Python程序來讀取文件中的隨機行
import random
def random_line(fname):
lines = open(fname).read().splitlines()
return random.choice(lines)
print(random_line('test.txt'))
Q73.編寫一個Python程序來計算文本文件中的行數
def file_lengthy(fname):
open(fname)as f:
for i,l in enumerate(f):
pass
return i + 1
print(“file of lines:”,file_lengthy(“test.txt”))
Q74.請寫一個Python邏輯,計算一個文件中的大寫字母數量
import os
os.chdir('C:\Users\lifei\Desktop')
with open('Today.txt') as today:
count=0
for i in today.read():
if i.isupper():
count+=1
print(count)
Q75.在Python中爲數值數據集編寫排序算法
以下代碼可用於在Python中對列表進行排序:
list = ["1", "4", "0", "6", "9"]
list = [int(i) for i in list]
list.sort()
print (list)
Django有關
Q76.請解釋或描述一下Django的架構
對於Django框架遵循MVC設計,並且有一個專有名詞:MVT,M全拼爲Model,與MVC中的M功能相同,負責數據處理,內嵌了ORM框架;V全拼爲View,與MVC中的C功能相同,接收HttpRequest,業務處理,返回HttpResponse;T全拼爲Template,與MVC中的V功能相同,負責封裝構造要返回的html,內嵌了模板引擎
Q77.Django,Pyramid和Flask之間的差異
Flask是一個“微框架”,主要用於具有更簡單要求的小型應用程序。Pyramid適用於大型應用程序,具有靈活性,允許開發人員爲他們的項目使用數據庫,URL結構,模板樣式等正確的工具。Django也可以像Pyramid一樣用於更大的應用程序。它包括一個ORM。
Q78.討論Django架構
Django架構
開發人員提供模型,視圖和模板,然後將其映射到URL,Django可以爲用戶提供服務。
Q79.解釋如何在Django中設置數據庫
Django使用SQLite作爲默認數據庫,它將數據作爲單個文件存儲在文件系統中。
如過你有數據庫服務器-PostgreSQL,MySQL,Oracle,MSSQL-並且想要使用它而不是SQLite,那麼使用數據庫的管理工具爲你的Django項目創建一個新的數據庫。
無論哪種方式,在您的(空)數據庫到位的情況下,剩下的就是告訴Django如何使用它。這是項目的settings.py文件的來源。
我們將以下代碼行添加到setting.py文件中:
DATABASES ={'default': {'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
Q80.舉例說明如何在Django中編寫VIEW?
這是我們在Django中使用write一個視圖的方法:
from django.http import HttpResponse
import datetime
def Current_datetime(request):
now =datetime.datetime.now()
html ="<html><body>It is now %s</body></html>"%now
return HttpResponse(html)
返回當前日期和時間,作爲HTML文檔。
Q81.提到Django模板的組成部分。
模板是一個簡單的文本文件。它可以創建任何基於文本的格式,如XML,CSV,HTML等。模板包含在評估模板時替換爲值的變量和控制模板邏輯的標記(%tag%)。
Q82.在Django框架中解釋會話的使用?
Django提供的會話允許您基於每個站點訪問者存儲和檢索數據。Django通過在客戶端放置會話ID cookie並在服務器端存儲所有相關數據來抽象發送和接收cookie的過程。
所以數據本身並不存儲在客戶端。從安全角度來看,這很好。
Q83.列出Django中的繼承樣式
在Django中,有三種可能的繼承樣式:
抽象基類:當你只希望父類包含而你不想爲每個子模型鍵入的信息時使用;
多表繼承:對現有模型進行子類化,並且需要每個模型都有自己的數據庫表。
代理模型:只想修改模型的Python級別行爲,而無需更改模型的字段。
數據分析
Q84.什麼是Python中的map函數?
map函數執行作爲第一個參數給出的函數,該函數作爲第二個參數給出的iterable的所有元素。如果給定的函數接受多於1個參數,則給出了許多迭代。
Q85.如何在NumPy數組中獲得N個最大值的索引?
我們可以使用下面的代碼在NumPy數組中獲得N個最大值的索引:
importnumpy as np
arr =np.array([1, 3, 2, 4, 5])
print(arr.argsort()[-3:][::-1])
4 3 1
Q86.如何用Python/ NumPy計算百分位數?
importnumpy as np
a =np.array([1,2,3,4,5]
p =np.percentile(a, 50) #Returns 50th percentile, e.g. median
print(p)
3
Q87.NumPy陣列在(嵌套)Python列表中提供了哪些優勢?
1)Python的列表是高效的通用容器。
它們支持(相當)有效的插入,刪除,追加和連接,Python的列表推導使它們易於構造和操作。
2)有一定的侷限性
它們不支持元素化加法和乘法等“向量化”操作,可以包含不同類型的對象這一事實意味着Python必須存儲每個元素的類型信息,並且必須在操作時執行類型調度代碼在每個元素上。
3)NumPy不僅效率更高,也更方便
你可以獲得大量的矢量和矩陣運算,這有時可以避免不必要的工作。
4)NumPy數組更快
你可以使用NumPy,FFT,卷積,快速搜索,基本統計,線性代數,直方圖等內置。
Q88.解釋裝飾器的用法
Python中的裝飾器用於修改或注入函數或類中的代碼。使用裝飾器,您可以包裝類或函數方法調用,以便在執行原始代碼之前或之後執行一段代碼。裝飾器可用於檢查權限,修改或跟蹤傳遞給方法的參數,將調用記錄到特定方法等
Q89.NumPy和SciPy有什麼區別?
1)在理想的世界中,NumPy只包含數組數據類型和最基本的操作:索引,排序,重新×××,基本元素函數等。
2)所有數字代碼都將駐留在SciPy中。然而,NumPy的一個重要目標是兼容性,因此NumPy試圖保留其前任任何一個支持的所有功能。
3)因此,NumPy包含一些線性代數函數,即使它們更恰當地屬於SciPy。無論如何,SciPy包含更多全功能的線性代數模塊版本,以及許多其他數值算法。
4)如果你使用python進行科學計算,你應該安裝NumPy和SciPy。大多數新功能屬於SciPy而非NumPy。
Q90.如何使用NumPy / SciPy製作3D繪圖/可視化?
與2D繪圖一樣,3D圖形超出了NumPy和SciPy的範圍,但就像2D情況一樣,存在與NumPy集成的包。Matplotlib在mplot3d子包中提供基本的3D繪圖,而Mayavi使用功能強大的VTK引擎提供各種高質量的3D可視化功能。
爬蟲和scary框架
Q91.scrapy和scrapy-redis有什麼區別?爲什麼選擇redis數據庫?
1) scrapy是一個Python爬蟲框架,爬取效率極高,具有高度定製性,但是不支持分佈式。
而scrapy-redis一套基於redis數據庫、運行在scrapy框架之上的組件,可以讓scrapy支持分佈式策略,Slaver端共享Master端redis數據庫裏的item隊列、請求隊列和請求指紋集合。
2) 因爲redis支持主從同步,而且數據都是緩存在內存中的,所以基於redis的分佈式爬蟲,對請求和數據的高頻讀取效率非常高。
Q92.你用過的爬蟲框架或者模塊有哪些?
Python自帶:urllib,urllib2
第 三 方:requests
框 架:Scrapy
urllib和urllib2模塊都做與請求URL相關的操作,但他們提供不同的功能。
urllib2.:urllib2.urlopen可以接受一個Request對象或者url,(在接受Request對象時候,並以此可以來設置一個URL 的headers),urllib.urlopen只接收一個url
urllib 有urlencode,urllib2沒有,因此總是urllib,urllib2常會一起使用的原因
scrapy是封裝起來的框架,他包含了下載器,解析器,日誌及異常處理,基於多線程, twisted的方式處理,對於固定單個網站的爬取開發,有優勢;但是對於多網站爬取 100個網站,併發及分佈式處理方面,不夠靈活,不便調整與括展。
request 是一個HTTP庫, 它只是用來,進行請求,對於HTTP請求,他是一個強大的庫,下載,解析全部自己處理,靈活性更高,高併發與分佈式部署也非常靈活,對於功能可以更好實現。
Q93.你常用的mysql引擎有哪些?各引擎間有什麼區別?
主要 MyISAM 與 InnoDB 兩個引擎,其主要區別如下:
1)InnoDB 支持事務,MyISAM 不支持,這一點是非常之重要。事務是一種高
級的處理方式,如在一些列增刪改中只要哪個出錯還可以回滾還原,而 MyISAM
就不可以了;
2)MyISAM 適合查詢以及插入爲主的應用,InnoDB 適合頻繁修改以及涉及到
安全性較高的應用;
3)InnoDB 支持外鍵,MyISAM 不支持;
4)MyISAM 是默認引擎,InnoDB 需要指定;
5)InnoDB 不支持 FULLTEXT 類型的索引;
6)InnoDB 中不保存表的行數,如 select count(*) from table 時,InnoDB;需要
掃描一遍整個表來計算有多少行,但是 MyISAM 只要簡單的讀出保存好的行數即
可。注意的是,當 count(*)語句包含 where 條件時 MyISAM 也需要掃描整個表;
7)對於自增長的字段,InnoDB 中必須包含只有該字段的索引,但是在 MyISAM
表中可以和其他字段一起建立聯合索引;
8)清空整個表時,InnoDB 是一行一行的刪除,效率非常慢。MyISAM 則會重
建表;
9)InnoDB 支持行鎖(某些情況下還是鎖整表,如 update table set a=1 where
user like '%lee%'
Q94.描述下scrapy框架運行的機制?
從start_urls裏獲取第一批url併發送請求,請求由引擎交給調度器入請求隊列,獲取完畢後,
調度器將請求隊列裏的請求交給下載器去獲取請求對應的響應資源,並將響應交給自己編寫的解析方法做提取處理:
1) 如果提取出需要的數據,則交給管道文件處理;
2)如果提取出url,則繼續執行之前的步驟(發送url請求,並由引擎將請求交給調度器入隊列...),直到請求隊列裏沒有請求,程序結束。
Q95.什麼是關聯查詢,有哪些?
將多個表聯合起來進行查詢,主要有內連接、左連接、右連接、全連接(外連接)
Q96.寫爬蟲是用多進程好?還是多線程好? 爲什麼?
IO密集型代碼(文件處理、網絡爬蟲等),多線程能夠有效提升效率(單線程下有IO操作會進行IO等待,造成不必要的時間浪費,
而開啓多線程能在線程A等待時,自動切換到線程B,可以不浪費CPU的資源,從而能提升程序執行效率)。
在實際的數據採集過程中,既考慮網速和響應的問題,也需要考慮自身機器的硬件情況來設置多進程或多線程。
Q97.數據庫的優化?
1)優化索引、SQL 語句、分析慢查詢;
2)優化硬件;採用SSD,使用磁盤隊列技術(RAID0,RAID1,RDID5)等;
3)採用MySQL 內部自帶的表分區技術,把數據分層不同的文件,能夠提高磁
盤的讀取效率;
4)選擇合適的表引擎,參數上的優化;
5)進行架構級別的緩存,靜態化和分佈式;
6)採用更快的存儲方式,例如 NoSQL存儲經常訪問的數據
Q98.分佈式爬蟲主要解決什麼問題?
1)ip
2)帶寬
3)cpu
4)io
Q99.爬蟲過程中驗證碼怎麼處理?
1)scrapy自帶
2)付費接口
Q100.常見的反爬蟲和應對方法?
1)通過Headers反爬蟲
從用戶請求的Headers反爬蟲是最常見的反爬蟲策略。可以直接在爬蟲中添加Headers,將瀏覽器的User-Agent複製到爬蟲的Headers中;或者將Referer值修改爲目標網站域名。
2)基於用戶行爲反爬蟲
通過檢測用戶行爲,例如同一IP短時間內多次訪問同一頁面,或者同一賬戶短時間內多次進行相同操作。
大多數網站都是前一種情況,對於這種情況,使用IP代理就可以解決。
可以專門寫一個爬蟲,爬取網上公開的代理ip,檢測後全部保存起來。
有了大量代理ip後可以每請求幾次更換一個ip,這在requests或者urllib2中很容易做到,這樣就能很容易的繞過第一種反爬蟲。
對於第二種情況,可以在每次請求後隨機間隔幾秒再進行下一次請求。
有些有邏輯漏洞的網站,可以通過請求幾次,退出登錄,重新登錄,繼續請求來繞過同一賬號短時間內不能多次進行相同請求的限制。
3)動態頁面的反爬蟲
首先用Fiddler對網絡請求進行分析,如果能夠找到ajax請求,也能分析出具體的參數和響應的具體含義,我們就能採用上面的方法。
直接利用requests或者urllib2模擬ajax請求,對響應的json進行分析得到需要的數據。
但是有些網站把ajax請求的所有參數全部加密了,沒辦法構造自己所需要的數據的請求。
這種情況下就用selenium+phantomJS,調用瀏覽器內核,並利用phantomJS執行js來模擬人爲操作以及觸發頁面中的js腳本。