第一部分 Python基礎(chǔ)篇(80題)
1、為什么學習Python?
? ??1.python是腳本語言,作為程序員至少應(yīng)該掌握一本通用腳本語言,因為腳本語言與編譯語言的開發(fā)測試過程不同,可以極大的提高編程效率;
2.python差不多是現(xiàn)在最流行的通用腳本語言。 這里強調(diào)是通用。與python相似的只有ruby, tcl, perl等少數(shù)幾種。 而python過去被稱為腳本語言之王;
3.python有廣泛的社區(qū)基本,可以說,只要你想到的問題,只要你需要使用的第三方庫,基本上都是python的接口。so easy;
4.python開發(fā)效率高,同樣的任務(wù),大約是java的10倍,c++的10-20倍;
5.python在科研上有大量的應(yīng)用,大數(shù)據(jù)計算,模擬計算,科學計算都有很多的包;
6.python幾乎在每一個linux操作系統(tǒng)上都安裝有。大部分unix系統(tǒng)也都缺省安裝,使用方便;
7.python有獨立的運行庫,幾乎不依賴第三方軟件就可以完成大部分的系統(tǒng)運維和常見任務(wù)的開發(fā);python幫助里還有許多例子代碼,幾乎拿過來略改一下就可以正式使用。
2、通過什么途徑學習的Python?
1.自學
2.網(wǎng)上看視頻
3.練習代碼,寫程序
3、Python和Java、PHP、C、C#、C++等其他語言的對比?
?1.python語言,是一種面向?qū)ο蟆⒅弊g式計算機程序設(shè)計語言,Python語法簡潔而清晰,具有豐富和強大的類庫。
2.python能夠很輕松的把用其他語言制作的各種模塊(尤其是C/C++)輕松地聯(lián)結(jié)在一起,能快速生成程序的原型,也提供了豐富的API和工具,以便程序員能夠輕松地使用C語言、C++、Cython來編寫擴充模塊。
4、簡述解釋型和編譯型編程語言?
解釋型語言編寫的程序不需要編譯,在執(zhí)行的時候,專門有一個解釋器能夠?qū)B語言翻譯成機器語言,每個語句都是執(zhí)行的時候才翻譯。這樣解釋型語言每執(zhí)行一次就要翻譯一次,效率比較低。
用編譯型語言寫的程序執(zhí)行之前,需要一個專門的編譯過程,通過編譯系統(tǒng),把源高級程序編譯成為機器語言文件,翻譯只做了一次,運行時不需要翻譯,所以編譯型語言的程序執(zhí)行效率高,但也不能一概而論,
5、Python解釋器種類以及特點?
1、Cpython(最常用的版本)
? ? ? ?Python的官方版本,使用C語言實現(xiàn),使用最為廣泛,CPython實現(xiàn)會將源文件(py文件)轉(zhuǎn)換成字節(jié)碼文件(pyc文件),然后運行在Python虛擬機上。
2、Jyhton
? ? ? ?Python的Java實現(xiàn),Jython會將Python代碼動態(tài)編譯成Java字節(jié)碼,然后在JVM上運行。
3、IronPython
? ? ? Python的C#實現(xiàn),IronPython將Python代碼編譯成C#字節(jié)碼,然后在CLR上運行。(與Jython類似)
4、PyPy(特殊)
? ? ? Python實現(xiàn)的Python,將Python的字節(jié)碼字節(jié)碼再編譯成機器碼。
6、位和字節(jié)的關(guān)系?
?8位(bit)=1字節(jié)(Byte),1024字節(jié)=1KB;
7、b、B、KB、MB、GB 的關(guān)系?
b 比特bit /?位?
B——字節(jié)
KB——千比特
MB——兆比特
GB——吉比特
1 B = 8b (8個bit/ 位) 一個字節(jié)(byte)等于8位(bit)
1 kB = 1024 B (kB - kilobajt)?
1 MB = 1024 kB (MB - megabajt)
1 GB = 1024 MB (GB - gigabajt)?
8、請至少列舉5個 PEP8 規(guī)范(越多越好)。
續(xù)行應(yīng)該與其包裹元素對齊,要么使用圓括號、方括號和花括號內(nèi)的隱式行連接來垂直對齊,要么使用掛行縮進對齊3。當使用掛行縮進時,應(yīng)該考慮到第一行不應(yīng)該有參數(shù),以及使用縮進以區(qū)分自己是續(xù)行。
當if語句的條件部分長到需要換行寫的時候,注意可以在兩個字符關(guān)鍵字的連接處(比如if),增加一個空格,再增加一個左括號來創(chuàng)造一個4空格縮進的多行條件。
在多行結(jié)構(gòu)中的大括號/中括號/小括號的右括號可以與內(nèi)容對齊單獨起一行作為最后一行的第一個字符
空格是首選的縮進方式。?
制表符只能用于與同樣使用制表符縮進的代碼保持一致。?
Python3不允許同時使用空格和制表符的縮進。?
混合使用制表符和空格縮進的Python2代碼應(yīng)該統(tǒng)一轉(zhuǎn)成空格。?
當在命令行加入-t選項執(zhí)行Python2時,它會發(fā)出關(guān)于非法混用制表符與空格的警告。當使用–tt時,這些警告會變成錯誤。強烈建議使用這樣的參數(shù)。
所有行限制的最大字符數(shù)為79。?
沒有結(jié)構(gòu)化限制的大塊文本(文檔字符或者注釋),每行的最大字符數(shù)限制在72。?
頂層函數(shù)和類的定義,前后用兩個空行隔開。?
類里的方法定義用一個空行隔開。?
導(dǎo)入通常在分開的行
導(dǎo)入總是位于文件的頂部,在模塊注釋和文檔字符串之后,在模塊的全局變量與常量之前。
推薦使用絕對路徑導(dǎo)入,如果導(dǎo)入系統(tǒng)沒有正確的配置(比如包里的一個目錄在sys.path里的路徑后),使用絕對路徑會更加可讀并且性能更好(至少能提供更好的錯誤信息)
9、通過代碼實現(xiàn)如下轉(zhuǎn)換:
二進制轉(zhuǎn)換成十進制:v = “0b1111011”
v = “0b1111011”
print(int(v,2))
十進制轉(zhuǎn)換成二進制:v = 18?
v = 18?
print("轉(zhuǎn)換為二進制為:", bin(v))
八進制轉(zhuǎn)換成十進制:v = “011”?
v = “011”?
print(int(v,8))
十進制轉(zhuǎn)換成八進制:v = 30?
print("轉(zhuǎn)換為八進制為:", oct(v))
十六進制轉(zhuǎn)換成十進制:v = “0x12”
v = “0x12”?
print(int(v,16))
十進制轉(zhuǎn)換成十六進制:v = 87
v = 87
print("轉(zhuǎn)換為十六進制為:", hex(v))
10、請編寫一個函數(shù)實現(xiàn)將IP地址轉(zhuǎn)換成一個整數(shù)。
如 10.3.9.12 轉(zhuǎn)換規(guī)則為:
10 ? ? ? ? ? 00001010
3 ? ? ? ? ? ?00000011
9 ? ? ? ? ? ?00001001
12 ? ? ? ? ? 00001100
再將以上二進制拼接起來計算十進制結(jié)果:00001010 00000011 00001001 00001100 = ?
my_ip =input("需要轉(zhuǎn)換的IP地址為")
my_ip = my_ip.split(".")
ip_1 =bin(int(my_ip[0]))[2:]
ip_2 =bin(int(my_ip[1]))[2:]
ip_3 =bin(int(my_ip[2]))[2:]
ip_4 =bin(int(my_ip[3]))[2:]
my_ip =int(ip_1+ip_2+ip_3+ip_4,base=2)
print(my_ip)
11、python遞歸的最大層數(shù)?
1000左右。理想狀態(tài)下為一千,實際為998或999。
12、求結(jié)果:
v1 =?1?or?3????# 1
v2 =?1?and?3? ? # 3
v3 =?0?and?2?and?1? ? # 0? ??
v4 =?0?and?2?or?1? ? # 1
v5 =?0?and?2?or?1?or?4? ? # 1
v6 =?0?or?False?and?1????# #False
1 3 0 1 1 False
13、ascii、unicode、utf-8、gbk 區(qū)別?
編碼??? ? ? ? ? ? ? ? ? ? ? ? ????????????????????? ? ??大小????? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?支持語言
ASCII? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?1個字? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 英文
Unicode? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2個字節(jié)(生僻字4個)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 所有語言
UTF-8? ? ? ? 1-6個字節(jié),英文字母1個字節(jié),漢字3個字節(jié),生僻字4-6個字節(jié)????所有語言
GBK? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?漢字和英文字母占2個字節(jié)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?漢字和英文
14、字節(jié)碼和機器碼的區(qū)別?
字節(jié)碼(Bytecode)是一種包含執(zhí)行程序、由一序列 op 代碼/數(shù)據(jù)對 組成的二進制文件。字節(jié)碼是一種中間碼,它比機器碼更抽象,需要直譯器轉(zhuǎn)譯后才能成為機器碼的中間代碼。
機器碼(machine code),學名機器語言指令,有時也被稱為原生碼(Native Code),是電腦的CPU可直接解讀的數(shù)據(jù)。
15、三元運算規(guī)則以及應(yīng)用場景?
c= a if a>1 else b #
16、列舉 Python2和Python3的區(qū)別?
python2和python3區(qū)別《《《==點擊這里
區(qū)別太多隨便記兩個
17、用一行代碼實現(xiàn)數(shù)值交換:
a = 1
b = 2
a,b=b,a
18、Python3和Python2中 int 和 long的區(qū)別?
?int(符號整數(shù)):通常被稱為整數(shù),沒有小數(shù)點的正或負整數(shù)。
?long(長整數(shù)):或渴望,無限大小的整數(shù),這樣寫整數(shù)和一個大寫或小寫的L
Python3中沒有l(wèi)ong函數(shù)
19、xrange和range的區(qū)別?
python3更新后,把xrange() 改名為range()
range?
函數(shù)說明:range([start,] stop[, step]),根據(jù)start與stop指定的范圍以及step設(shè)定的步長,生成一個列表。?
xrange?
函數(shù)說明:和range?的用法完全相同,但是返回的是一個生成器。?
20、文件操作時:xreadlines和readlines的區(qū)別?
* readline() >> reads a single line from file with newline at the end。
???readline()讀取一行內(nèi)容,放到一個字符串變量,返回str類型。
* readlines() >> returns a list containing all the lines in the file
readlines() 讀取文件所有內(nèi)容,按行為單位放到一個列表中,返回list類型。
* xreadlines() >> Returns a generator to loop over every single line in the file
?返回一個生成器,來循環(huán)操作文件的每一行。循環(huán)使用時和readlines基本一樣,但是直接打印就不同
print f.xreadlines()
print f.readlines()
輸出如下:
['f3tttt22221111133\n', 'fucttttx3tttt22221111133\n', 'fucttttx3tttt22221111133\n', 'fucttttx3tttt22221111133\n', 'fucttttx3tttt22221111133\n', 'fucttttx3tttt22221111133\n', 'fucttttx3tttt22221111133\n', 'fttx3tttt2222111113endend\n']
所以二者類型不同。但使用時相同。
21、列舉布爾值為False的常見值?
數(shù)字0
特殊值的 null
NaN
undefined
字符串
None
22、字符串、列表、元組、字典每個常用的5個方法?
列表-查 值 = 列表[index] 根據(jù)索引下標查找值 index = 列表.index(值) 從列表中找出某個值第一個匹配項的索引位置 count = 列表.count(值) 統(tǒng)計某個元素在列表中出現(xiàn)的次數(shù) lenth = len(列表) 查詢列表的長度,元素的個數(shù) max(列表) ,min(列表) 查詢列表中的最大值,最小值 列表-增 列表.append(值) 新增到末尾 列表.insert(下標,值) 插入到指定位置 列表.extend(列表) 列表末尾一次性追加另一個序列中的多個值 (用新列表擴展原來的列表)。 列表-改列表[下標] = 值 根據(jù)下標修改其值 列表-刪 列表.pop() 刪除末尾元素,并返回此元素 列表.pop(下標) 根據(jù)元素下標刪除,并返回次元素 del 列表[下標] 根據(jù)元素下標刪除 列表.remove(值) 根據(jù)元素的值刪除 列表-判斷 in(存在) 如果存在那么結(jié)果為True,否則為False not in(不存在) 如果不存在那么結(jié)果為True,否則False 列表-運算符 + * + 和 * 的操作符與字符串相似。 + 號用于組合列表,* 號用于重復(fù)列表。 列表-排序 列表.reverse() 反向列表中元素
8/50
? ? ? ? 列表.sort()? ? ? ? ? ? 對原列表進行排序,如果指定參數(shù),則使用 比較函數(shù)指定的比較函數(shù)? ? ? ? 列表-切片? ? ? ? 列表[num1:num2:num3]? ? ? ? ? ? num1,num2都是列表的下標num3是間隔返 回一個新的列表
23、lambda表達式格式以及應(yīng)用場景?
代替一些簡單的函數(shù),使得代碼看上去更簡潔并且可讀性高
比如f = lambda x:x+=1
24、pass的作用?
1、pass語句什么也不做,一般作為占位符或者創(chuàng)建占位程序,pass語句不會執(zhí)行任何操作2、保證格式完整 3、保證語義完整
25、*arg和**kwarg作用
*args:可以理解為只有一列的表格,長度不固定。
**kwargs:可以理解為字典,長度也不固定。
*arg會把多出來的位置參數(shù)轉(zhuǎn)化為tuple
**kwarg會把關(guān)鍵字參數(shù)轉(zhuǎn)化為dict
26、is和==的區(qū)別
==是python標準操作符中的比較操作符,用來比較判斷兩個對象的value(值)是否相等
is也被叫做同一性運算符,這個運算符比較判斷的是對象間的唯一身份標識,也就是id是否相同
個人理解,==比較的是值,is比較的是地址。
27、簡述Python的深淺拷貝以及應(yīng)用場景?
深淺拷貝用法來自copy模塊。
導(dǎo)入模塊:import copy
淺拷貝:copy.copy
深拷貝:copy.deepcopy
字面理解:淺拷貝指僅僅拷貝數(shù)據(jù)集合的第一層數(shù)據(jù),深拷貝指拷貝數(shù)據(jù)集合的所有層。
深拷貝的時候python將字典的所有數(shù)據(jù)在內(nèi)存中新建了一份,所以如果你修改新的模版的時候老模版不會變。
相反,在淺copy 的時候,python僅僅將最外層的內(nèi)容在內(nèi)存中新建了一份出來,字典第二層的列表并沒有在內(nèi)存中新建,所以你修改了新模版,默認模版也被修改了。
28、Python垃圾回收機制?
Python中的垃圾回收是以引用計數(shù)為主,分代收集為輔。引用計數(shù)的缺陷是循環(huán)引用的問題。
在Python中,如果一個對象的引用數(shù)為0,Python虛擬機就會回收這個對象的內(nèi)存。
在Python中,采用分代收集的方法。把對象分為三代,一開始,對象在創(chuàng)建的時候,放在一代中,如果在一次一代的垃圾檢查中,改對象存活下來,就會被放到二代中,同理在一次二代的垃圾檢查中,該對象存活下來,就會被放到三代中。
29、Python的可變類型和不可變類型?
不可變的:數(shù)字、字符串、元組
可變的:列表、字典是
30、求結(jié)果:
v = dict.fromkeys(['k1','k2'],[])
v[‘k1’].append(666)
print(v)
v[‘k1’] =?777
print(v)
31、求結(jié)果:
32、列舉常見的內(nèi)置函數(shù)?
屠龍寶刀,點擊就送<<點這里
33、filter、map、reduce的作用?
34、一行代碼實現(xiàn)9*9乘法表
print '\n'.join([' '.join(['%s*%s=%-2s' % (y,x,x*y) for y in range(1,x+1)]) for x in range(1,10)])
35、如何安裝第三方模塊?以及用過哪些第三方模塊?
36、至少列舉8個常用模塊都有那些?
1.time模塊
????????time模塊提供各種操作時間的函數(shù)
2. datetime模塊
3.sys模塊
?? ????用于提供對解釋器相關(guān)的訪問及維護,并有很強的交互功能
4.pickle模塊
pickle,用于python特有的類型 和 python的數(shù)據(jù)類型間進行轉(zhuǎn)換
?????????pickle模塊提供了四個功能:dumps、dump、loads、load
5.os模塊
????????作用:用于提供系統(tǒng)級別的操作
6.hashlib模塊
作用:用于加密相關(guān)的操作,代替了md5模塊和sha模塊,主要提供?SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法
7.random
作用:生成隨機變量
8.shutil模塊
9.XML處理模塊
10.logging 模塊
python的logging模塊提供了標準的日志接口,你可以通過它存儲各種格式的日志,logging的日志可以分為debug(),info(),warning(),error()andcritical()5個級別。
11.、configparser模塊
???? 用于生成和修改常見配置文檔
12.json & pickle 模塊
用于序列化的兩個模塊
json,用于字符串 和 python數(shù)據(jù)類型間進行轉(zhuǎn)換
pickle,用于python特有的類型 和 python的數(shù)據(jù)類型間進行轉(zhuǎn)換
Json模塊提供了四個功能:dumps、dump、loads、load
pickle模塊提供了四個功能:dumps、dump、loads、load
37、re的match和search區(qū)別?
match()函數(shù)只檢測RE是不是在string的開始位置匹配,
?search()會掃描整個string查找匹配;
也就是說match()只有在0位置匹配成功的話才有返回,
如果不是開始位置匹配成功的話,match()就返回none。
38、什么是正則的貪婪匹配?
如:String str="abcaxc";
Patter p="ab*c";
貪婪匹配:正則表達式一般趨向于最大長度匹配,也就是所謂的貪婪匹配。如上面使用模式p匹配字符串str,結(jié)果就是匹配到:abcaxc(ab*c)。
非貪婪匹配:就是匹配到結(jié)果就好,就少的匹配字符。如上面使用模式p匹配字符串str,結(jié)果就是匹配到:abc(ab*c)。
39、求結(jié)果: a. [ i % 2 for i in range(10) ] b. ( i % 2 for i in range(10) )
40、求結(jié)果: a. 1 or 2 b. 1 and 2 c. 1 < (2==2) d. 1 < 2 == 2
41、def func(a,b=[]) 這種寫法有什么坑?
deffunc(a,b=[]):
? ? b.append(a)
? ? print(b)
func(1)
func(1)
func(1)
func(1)
結(jié)果為:
????????[1]
[1, 1]
[1, 1, 1]
[1, 1, 1, 1]
函數(shù)的第二個默認參數(shù)是一個list,當?shù)谝淮螆?zhí)行的時候?qū)嵗艘粋€list,第二次執(zhí)行還是用第一次執(zhí)行的時候?qū)嵗牡刂反鎯?,所以三次?zhí)行的結(jié)果就是 [1, 1, 1] ,想每次執(zhí)行只輸出[1] ,默認參數(shù)應(yīng)該設(shè)置為None。
42、如何實現(xiàn) “1,2,3” 變成 [‘1’,’2’,’3’] ?
a=“1,2,3”
a.split(",")
43、如何實現(xiàn)[‘1’,’2’,’3’]變成[1,2,3] ?
a=[‘1’,’2’,’3’]
ls=[]
for i in a:
? ? a.append(i)
44、比較: a = [1,2,3] 和 b = [(1),(2),(3) ] 以及 b = [(1,),(2,),(3,) ] 的區(qū)別?
a為列表嵌套數(shù)字
b為列表嵌套的set集合
c為列表嵌套元組
45、如何用一行代碼生成[1,4,9,16,25,36,49,64,81,100] ?f
46、一行代碼實現(xiàn)刪除列表中重復(fù)的值 ?
把列表轉(zhuǎn)成set集合即可
47、如何在函數(shù)中設(shè)置一個全局變量 ?
x=1
globle x?
48、logging模塊的作用?以及應(yīng)用場景?
logging模塊定義的函數(shù)和類為應(yīng)用程序和庫的開發(fā)實現(xiàn)了一個靈活的事件日志系統(tǒng)。logging模塊是Python的一個標準庫模塊,由標準庫模塊提供日志記錄API的關(guān)鍵好處是所有Python模塊都可以使用這個日志記錄功能。所以,你的應(yīng)用日志可以將你自己的日志信息與來自第三方模塊的信息整合起來。
?????可以通過設(shè)置不同的日志等級,在release版本中只輸出重要信息,而不必顯示大量的調(diào)試信息;
? ? ? ? ? ??print將所有信息都輸出到標準輸出中,嚴重影響開發(fā)者從標準輸出中查看其它數(shù)據(jù);logging則可以由開發(fā)者決定將信息輸出到什么地方,以及怎么輸出;
49、請用代碼簡答實現(xiàn)stack 。
stack的第一種含義是一組數(shù)據(jù)的存放方式,特點為LIFO,即后進先出
50、常用字符串格式化哪幾種?
Python的字符串格式化常用的有三種!
第一種:最方便的
缺點:需一個個的格式化
print(‘hello?%s?and?%s‘%(‘df‘,‘a(chǎn)nother?df‘))
第二種:最好用的
優(yōu)點:不需要一個個的格式化,可以利用字典的方式,縮短時間
print(‘hello?%(first)s?and?%(second)s‘%{‘first‘:‘df‘,‘second‘:‘a(chǎn)nother df‘})
第三種:最先進的
??優(yōu)點:可讀性強
print(‘hello?{first}?and?{second}‘.format(first=‘df‘,second=‘a(chǎn)nother?df‘))
51、簡述 生成器、迭代器、可迭代對象 以及應(yīng)用場景?
52、用Python實現(xiàn)一個二分查找的函數(shù)。
53、談?wù)勀銓﹂]包的理解?
54、os和sys模塊的作用?
????????OS模塊是Python標準庫中的一個用于訪問操作系統(tǒng)功能的模塊,使用OS模塊中提供的接口,可以實現(xiàn)跨平臺訪問
????????sys模塊主要是用于提供對python解釋器相關(guān)的操作
55、如何生成一個隨機數(shù)?
?引入random模塊? random.random()
56、如何使用python刪除一個文件?
??os.remove(path)
57、談?wù)勀銓γ嫦驅(qū)ο蟮睦斫猓?/h1>
面向?qū)ο笫窍颥F(xiàn)實世界模型的自然延伸,這是一種“萬物皆對象”的編程思想
????????????在現(xiàn)實生活中的任何物體都可以歸為一類事物,而每一個個體都是一類事物的實例
????????????面向?qū)ο蟮木幊淌且詫ο鬄橹行模韵轵?qū)動,所以程序=對象+消息
58、Python面向?qū)ο笾械睦^承有什么特點?
繼承的優(yōu)點:
1、建造系統(tǒng)中的類,避免重復(fù)操作。
2、新類經(jīng)常是基于已經(jīng)存在的類,這樣就可以提升代碼的復(fù)用程度。
繼承的特點:
1、在繼承中基類的構(gòu)造(__init__()方法)不會被自動調(diào)用,它需要在其派生類的構(gòu)造中親自專門調(diào)用。有別于C#
2、在調(diào)用基類的方法時,需要加上基類的類名前綴,且需要帶上self參數(shù)變量。區(qū)別于在類中調(diào)用普通函數(shù)時并不需要帶上self參數(shù)
3、Python總是首先查找對應(yīng)類型的方法,如果它不能在派生類中找到對應(yīng)的方法,它才開始到基類中逐個查找。(先在本類中查找調(diào)用的方法,找不到才去基類中找)。
59、面向?qū)ο笊疃葍?yōu)先和廣度優(yōu)先是什么?
60、面向?qū)ο笾衧uper的作用?
super() 函數(shù)是用于調(diào)用父類(超類)的一個方法。
super 是用來解決多重繼承問題的,直接用類名調(diào)用父類方法在使用單繼承的時候沒問題,但是如果使用多繼承,會涉及到查找順序(MRO)、重復(fù)調(diào)用(鉆石繼承)等種種問題。
MRO 就是類的方法解析順序表, 其實也就是繼承父類方法時的順序表。
61、是否使用過functools中的函數(shù)?其作用是什么?
Python的functools模塊用以為可調(diào)用對象(callable objects)定義高階函數(shù)或操作。簡單地說,就是基于已有的函數(shù)定義新的函數(shù)。
所謂高階函數(shù),就是以函數(shù)作為輸入?yún)?shù),返回也是函數(shù)。
1. functools模塊的引用
from functools import partial
2. functools模塊的組成
partial(func, *args, **keywords)
通過封裝,重新定義已有的函數(shù),如增減參數(shù)、設(shè)置初始值或改變返回值。
該函數(shù)的返回partial對象,其中包含3個只讀屬性:
?partial.func
?partial.args
?partial.keywords
@total_ordering
修飾class
實現(xiàn)多個比較操作方法,如__eq__, __lt__等
@lru_cache(maxsize=128, typed=False)
修飾方法,重新定義已有的函數(shù)
只存在于內(nèi)存中
@singledispatch(default)
修飾方法
將函數(shù)轉(zhuǎn)換為 single-dispatch generic function
@wraps(wrapped_func, assigned=WRAPPER_ASSIGNMENTS, updated=WRAPPER_UPDATES)
調(diào)用update_wrapper()方法的簡便實現(xiàn)
update_wrapper(wrapper, wrapped, assigned=WRAPPER_ASSIGNMENTS, updated=WRAPPER_UPDATES)
reduce(function, iterable[, initializer])
cmp_to_key(func)
62、列舉面向?qū)ο笾袔щp下劃線的特殊方法,如:__new__、__init__
63、如何判斷是函數(shù)還是方法?
函數(shù):
函數(shù)是封裝了一些獨立的功能,可以直接調(diào)用,python內(nèi)置了許多函數(shù),同時可以自建函數(shù)來使用。
方法:
方法和函數(shù)類似,同樣封裝了獨立的功能,但是方法是需要通過對象來調(diào)用的,表示針對這個對象要做的操作,使用時采用點方法。
64、靜態(tài)方法和類方法區(qū)別?
classA(object):
????deffun_a(self):#實例方法
????????pass
????@staticmethod
????deffun_b():#靜態(tài)方法
????????pass
? ?@classmethod
????deffun_c(cls):#類方法
????????pass
雖然靜態(tài)方法和類方法調(diào)用方式都一樣,都可以通過【類.方法名】來使用,但是類方法中有默認屬性cls,指向自身的類,所以一般如果是單一的工具函數(shù)定義成靜態(tài)方法,如果還需要調(diào)用類中其他的靜態(tài)方法,或者類方法的函數(shù)定義成類方法。
一、先是在語法上面的區(qū)別:
1、靜態(tài)方法不需要傳入self參數(shù),類成員方法需要傳入代表本類的cls參數(shù);
2、靜態(tài)方法是無妨訪問實例變量和類變量的,類成員方法無法訪問實例變量但是可以訪問類變量
二、使用的區(qū)別:
由于靜態(tài)方法無法訪問類屬性,實例屬性,相當于一個相對獨立的方法,跟類其實并沒有什么關(guān)系。這樣說來,靜態(tài)方法就是在類的作用域里的函數(shù)而已
65、列舉面向?qū)ο笾械奶厥獬蓡T以及應(yīng)用場景
66、1、2、3、4、5 能組成多少個互不相同且無重復(fù)的三位數(shù)
67、什么是反射?以及應(yīng)用場景?
68、metaclass作用?以及應(yīng)用場景?
69、用盡量多的方法實現(xiàn)單例模式。
70、裝飾器的寫法以及應(yīng)用場景。
71、異常處理寫法以及如何主動跑出異常(應(yīng)用場景)
72、什么是面向?qū)ο蟮膍ro
73、isinstance作用以及應(yīng)用場景?
74、寫代碼并實現(xiàn):
Given an array?of?integers,?return?indices?of?the two numbers such that they add up to a specific target.You may assume that each input would?
have exactly one solution,?and?you may?not?use the same element twice.
Example:
Given nums = [2,?7,?11,?15], target =?9,
Because nums[0] + nums[1] =?2?+?7?=?9,
?return?[0,?1]
75、json序列化時,可以處理的數(shù)據(jù)類型有哪些?如何定制支持datetime類型?
76、json序列化時,默認遇到中文會轉(zhuǎn)換成unicode,如果想要保留中文怎么辦?
77、什么是斷言?應(yīng)用場景?
78、有用過with statement嗎?它的好處是什么?
79、使用代碼實現(xiàn)查看列舉目錄下的所有文件。
80、簡述 yield和yield from關(guān)鍵字。
第二部分?網(wǎng)絡(luò)編程和并發(fā)(34題)
1、簡述 OSI 七層協(xié)議。
1、物理層
為數(shù)據(jù)鏈路層提供物理連接,實現(xiàn)比特流的透明傳輸,所傳輸數(shù)據(jù)的單位是比特,該層定義了通信設(shè)備與傳輸線接口硬件的電氣、機械以及功能和過程的特性。
2、數(shù)據(jù)鏈路層
在通信的實體之間建立數(shù)據(jù)鏈路連接,傳送以幀為單位的數(shù)據(jù),通過檢查發(fā)生在連接通信系統(tǒng)間傳送路上的比特錯誤并進行恢復(fù),確保比特序列組成為數(shù)據(jù)流準確無誤地傳送給對方的系統(tǒng)。數(shù)據(jù)鏈路層在相鄰的節(jié)點之間實現(xiàn)透明的高可靠性傳輸。
3、網(wǎng)絡(luò)層
解決多節(jié)點傳送時的路由選擇、擁擠控制及網(wǎng)絡(luò)互連等,控制分組傳送系統(tǒng)的操作,它的特性對高層是透明的,同時,根據(jù)傳輸層的要求選擇服務(wù)質(zhì)量,并向傳輸層報告未恢復(fù)的差錯。
4、傳輸層
為兩個端系統(tǒng)(源站和目標站)的會話層之間建立一條傳輸連接,可靠、透明地傳送報文,執(zhí)行端一端差錯控制、順序和流量控制、管理多路復(fù)用等。本層提供建立、維護和拆除傳送連接的功能,并保證網(wǎng)絡(luò)連接的質(zhì)量。它向高層屏蔽了下層數(shù)據(jù)通信的細節(jié),因而是OSI網(wǎng)絡(luò)參考模型中最需要的一層。
5、會話層
不參與具體的數(shù)據(jù)傳輸,但對數(shù)據(jù)傳輸?shù)耐竭M行管理。它主要負責提供兩個進程之間建立、維護和結(jié)束會話連接功能,同時要對進程中必要的信息傳送方式、進程間的同步以及重新同步進行管理。
6、表示層
解決在兩個通信系統(tǒng)中交換信息時不同數(shù)據(jù)格式的編碼之間的轉(zhuǎn)換,語法選擇,數(shù)據(jù)加密與解密及文本壓縮等。
7、應(yīng)用層
負責向用戶提供各種網(wǎng)絡(luò)應(yīng)用服務(wù),如文件傳輸、電子郵件、遠程訪問等。把進程中于對方進程通信的部分放入應(yīng)用實體中,同時,對各種業(yè)務(wù)內(nèi)容的通信功能進行管理。
2、什么是C/S和B/S架構(gòu)?
3、簡述 三次握手、四次揮手的流程。
4、什么是arp協(xié)議?
5、TCP和UDP的區(qū)別?
6、什么是局域網(wǎng)和廣域網(wǎng)?
7、為何基于tcp協(xié)議的通信比基于udp協(xié)議的通信更可靠?
8、什么是socket?簡述基于tcp協(xié)議的套接字通信流程。
9、什么是粘包? socket 中造成粘包的原因是什么? 哪些情況會發(fā)生粘包現(xiàn)象?
10、IO多路復(fù)用的作用?
11、什么是防火墻以及作用?
12、select、poll、epoll 模型的區(qū)別?
13、簡述 進程、線程、協(xié)程的區(qū)別 以及應(yīng)用場景?
14、GIL鎖是什么鬼?
15、Python中如何使用線程池和進程池?
16、threading.local的作用?
17、進程之間如何進行通信?
18、什么是并發(fā)和并行?
19、進程鎖和線程鎖的作用?
20、解釋什么是異步非阻塞?
21、路由器和交換機的區(qū)別?
22、什么是域名解析?
23、如何修改本地hosts文件?
24、生產(chǎn)者消費者模型應(yīng)用場景及優(yōu)勢?
25、什么是cdn?
26、LVS是什么及作用?
27、Nginx是什么及作用?
28、keepalived是什么及作用?
29、haproxy是什么以及作用?
30、什么是負載均衡?
31、什么是rpc及應(yīng)用場景?
32、簡述 asynio模塊的作用和應(yīng)用場景。
33、簡述 gevent模塊的作用和應(yīng)用場景。
34、twisted框架的使用和應(yīng)用?
第三部分 數(shù)據(jù)庫和緩存(46題)
1、列舉常見的關(guān)系型數(shù)據(jù)庫和非關(guān)系型都有那些?
2、MySQL常見數(shù)據(jù)庫引擎及比較?
3、簡述數(shù)據(jù)三大范式?
4、什么是事務(wù)?MySQL如何支持事務(wù)?
5、簡述數(shù)據(jù)庫設(shè)計中一對多和多對多的應(yīng)用場景?
6、如何基于數(shù)據(jù)庫實現(xiàn)商城商品計數(shù)器?
7、常見SQL(必備)
詳見武沛齊博客:https://www.cnblogs.com/wupeiqi/articles/5729934.html
8、簡述觸發(fā)器、函數(shù)、視圖、存儲過程?
9、MySQL索引種類
10、索引在什么情況下遵循最左前綴的規(guī)則?
11、主鍵和外鍵的區(qū)別?
12、MySQL常見的函數(shù)?
13、列舉 創(chuàng)建索引但是無法命中索引的8種情況。
14、如何開啟慢日志查詢?
15、數(shù)據(jù)庫導(dǎo)入導(dǎo)出命令(結(jié)構(gòu)+數(shù)據(jù))?
16、數(shù)據(jù)庫優(yōu)化方案?
17、char和varchar的區(qū)別?
18、簡述MySQL的執(zhí)行計劃?
19、在對name做了唯一索引前提下,簡述以下區(qū)別:
select?*?from?tb?where?name?= ‘Oldboy-Wupeiqi’?
select?*?from?tb?where?name?= ‘Oldboy-Wupeiqi’?limit?1
20、1000w條數(shù)據(jù),使用limit offset 分頁時,為什么越往后翻越慢?如何解決?
21、什么是索引合并?
22、什么是覆蓋索引?
23、簡述數(shù)據(jù)庫讀寫分離?
24、簡述數(shù)據(jù)庫分庫分表?(水平、垂直)
25、redis和memcached比較?
26、redis中數(shù)據(jù)庫默認是多少個db 及作用?
27、python操作redis的模塊?
28、如果redis中的某個列表中的數(shù)據(jù)量非常大,如果實現(xiàn)循環(huán)顯示每一個值?
29、redis如何實現(xiàn)主從復(fù)制?以及數(shù)據(jù)同步機制?
30、redis中的sentinel的作用?
31、如何實現(xiàn)redis集群?
32、redis中默認有多少個哈希槽?
33、簡述redis的有哪幾種持久化策略及比較?
34、列舉redis支持的過期策略。
35、MySQL 里有 2000w 數(shù)據(jù),redis 中只存 20w 的數(shù)據(jù),如何保證 redis 中都是熱點數(shù)據(jù)??
36、寫代碼,基于redis的列表實現(xiàn) 先進先出、后進先出隊列、優(yōu)先級隊列。
37、如何基于redis實現(xiàn)消息隊列?
38、如何基于redis實現(xiàn)發(fā)布和訂閱?以及發(fā)布訂閱和消息隊列的區(qū)別?
39、什么是codis及作用?
40、什么是twemproxy及作用?
41、寫代碼實現(xiàn)redis事務(wù)操作。
42、redis中的watch的命令的作用?
43、基于redis如何實現(xiàn)商城商品數(shù)量計數(shù)器?
44、簡述redis分布式鎖和redlock的實現(xiàn)機制。
45、什么是一致性哈希?Python中是否有相應(yīng)模塊?
46、如何高效的找到redis中所有以oldboy開頭的key?
第四部分 前端、框架和其他(155題)
1、談?wù)勀銓ttp協(xié)議的認識。
2、談?wù)勀銓ebsocket協(xié)議的認識。
3、什么是magic string ?
4、如何創(chuàng)建響應(yīng)式布局?
5、你曾經(jīng)使用過哪些前端框架?
6、什么是ajax請求?并使用jQuery和XMLHttpRequest對象實現(xiàn)一個ajax請求。
7、如何在前端實現(xiàn)輪訓?
8、如何在前端實現(xiàn)長輪訓?
9、vuex的作用?
10、vue中的路由的攔截器的作用?
11、axios的作用?
12、列舉vue的常見指令。
13、簡述jsonp及實現(xiàn)原理?
14、是什么cors ?
15、列舉Http請求中常見的請求方式?
16、列舉Http請求中的狀態(tài)碼?
17、列舉Http請求中常見的請求頭?
18、看圖寫結(jié)果:
19、看圖寫結(jié)果:
20、看圖寫結(jié)果:
21、看圖寫結(jié)果:
22、看圖寫結(jié)果:
23、看圖寫結(jié)果:
24、django、flask、tornado框架的比較?
25、什么是wsgi?
26、django請求的生命周期?
27、列舉django的內(nèi)置組件?
28、列舉django中間件的5個方法?以及django中間件的應(yīng)用場景?
29、簡述什么是FBV和CBV?
30、django的request對象是在什么時候創(chuàng)建的?
31、如何給CBV的程序添加裝飾器?
32、列舉django orm 中所有的方法(QuerySet對象的所有方法)
33、only和defer的區(qū)別?
34、select_related和prefetch_related的區(qū)別?
35、filter和exclude的區(qū)別?
36、列舉django orm中三種能寫sql語句的方法。
37、django orm 中如何設(shè)置讀寫分離?
38、F和Q的作用?
39、values和values_list的區(qū)別?
40、如何使用django orm批量創(chuàng)建數(shù)據(jù)?
41、django的Form和ModeForm的作用?
42、django的Form組件中,如果字段中包含choices參數(shù),請使用兩種方式實現(xiàn)數(shù)據(jù)源實時更新。
43、django的Model中的ForeignKey字段中的on_delete參數(shù)有什么作用?
44、django中csrf的實現(xiàn)機制?
45、django如何實現(xiàn)websocket?
46、基于django使用ajax發(fā)送post請求時,都可以使用哪種方法攜帶csrf token?
47、django中如何實現(xiàn)orm表中添加數(shù)據(jù)時創(chuàng)建一條日志記錄。
48、django緩存如何設(shè)置?
49、django的緩存能使用redis嗎?如果可以的話,如何配置?
50、django路由系統(tǒng)中name的作用?
51、django的模板中filter和simple_tag的區(qū)別?
52、django-debug-toolbar的作用?
53、django中如何實現(xiàn)單元測試?
54、解釋orm中 db first 和 code first的含義?
55、django中如何根據(jù)數(shù)據(jù)庫表生成model中的類?
56、使用orm和原生sql的優(yōu)缺點?
57、簡述MVC和MTV
58、django的contenttype組件的作用?
59、談?wù)勀銓estfull 規(guī)范的認識?
60、接口的冪等性是什么意思?
61、什么是RPC?
62、Http和Https的區(qū)別?
63、為什么要使用django rest framework框架?
64、django rest framework框架中都有那些組件?
65、django rest framework框架中的視圖都可以繼承哪些類?
66、簡述 django rest framework框架的認證流程。
67、django rest framework如何實現(xiàn)的用戶訪問頻率控制?
68、Flask框架的優(yōu)勢?
69、Flask框架依賴組件?
70、Flask藍圖的作用?
71、列舉使用過的Flask第三方組件?
72、簡述Flask上下文管理流程?
73、Flask中的g的作用?
74、Flask中上下文管理主要涉及到了那些相關(guān)的類?并描述類主要作用?
75、為什么要Flask把Local對象中的的值stack 維護成一個列表?
76、Flask中多app應(yīng)用是怎么完成?
77、在Flask中實現(xiàn)WebSocket需要什么組件?
78、wtforms組件的作用?
79、Flask框架默認session處理機制?
80、解釋Flask框架中的Local對象和threading.local對象的區(qū)別?
81、Flask中 blinker 是什么?
82、SQLAlchemy中的 session和scoped_session 的區(qū)別?
83、SQLAlchemy如何執(zhí)行原生SQL?
84、ORM的實現(xiàn)原理?
85、DBUtils模塊的作用?
86、以下SQLAlchemy的字段是否正確?如果不正確請更正:
from?datetime?import?datetime
from?sqlalchemy.ext.declarative
import?declarative_base
from?sqlalchemy?import?Column, Integer, String, DateTime
Base = declarative_base()
class?UserInfo(Base):
__tablename__ =?'userinfo'
id = Column(Integer, primary_key=True, autoincrement=True)
name = Column(String(64), unique=True)
ctime = Column(DateTime, default=datetime.now())
87、SQLAchemy中如何為表設(shè)置引擎和字符編碼?
88、SQLAchemy中如何設(shè)置聯(lián)合唯一索引?
89、簡述Tornado框架的特點。
90、簡述Tornado框架中Future對象的作用?
91、Tornado框架中如何編寫WebSocket程序?
92、Tornado中靜態(tài)文件是如何處理的?如:
93、Tornado操作MySQL使用的模塊?
94、Tornado操作redis使用的模塊?
95、簡述Tornado框架的適用場景?
96、git常見命令作用:
97、簡述以下git中stash命令作用以及相關(guān)其他命令。
98、git 中 merge 和 rebase命令 的區(qū)別。
99、公司如何基于git做的協(xié)同開發(fā)?
100、如何基于git實現(xiàn)代碼review?
101、git如何實現(xiàn)v1.0 、v2.0 等版本的管理?
102、什么是gitlab?
103、github和gitlab的區(qū)別?
104、如何為github上牛逼的開源項目貢獻代碼?
105、git中 .gitignore文件的作用?
106、什么是敏捷開發(fā)?
107、簡述 jenkins 工具的作用?
108、公司如何實現(xiàn)代碼發(fā)布?
109、簡述 RabbitMQ、Kafka、ZeroMQ的區(qū)別?
110、RabbitMQ如何在消費者獲取任務(wù)后未處理完前就掛掉時,保證數(shù)據(jù)不丟失?
111、RabbitMQ如何對消息做持久化?
112、RabbitMQ如何控制消息被消費的順序?
113、以下RabbitMQ的exchange type分別代表什么意思?如:fanout、direct、topic。
114、簡述 celery 是什么以及應(yīng)用場景?
115、簡述celery運行機制。
116、celery如何實現(xiàn)定時任務(wù)?
117、簡述 celery多任務(wù)結(jié)構(gòu)目錄?
118、celery中裝飾器 @app.task 和 @shared_task的區(qū)別?
119、簡述 requests模塊的作用及基本使用?
120、簡述 beautifulsoup模塊的作用及基本使用?
121、簡述 seleninu模塊的作用及基本使用?
122、scrapy框架中各組件的工作流程?
123、在scrapy框架中如何設(shè)置代理(兩種方法)?
124、scrapy框架中如何實現(xiàn)大文件的下載?
125、scrapy中如何實現(xiàn)限速?
126、scrapy中如何實現(xiàn)暫定爬蟲?
127、scrapy中如何進行自定制命令?
128、scrapy中如何實現(xiàn)的記錄爬蟲的深度?
129、scrapy中的pipelines工作原理?
130、scrapy的pipelines如何丟棄一個item對象?
131、簡述scrapy中爬蟲中間件和下載中間件的作用?
132、scrapy-redis組件的作用?
133、scrapy-redis組件中如何實現(xiàn)的任務(wù)的去重?
134、scrapy-redis的調(diào)度器如何實現(xiàn)任務(wù)的深度優(yōu)先和廣度優(yōu)先?
135、簡述 vitualenv 及應(yīng)用場景?
136、簡述 pipreqs 及應(yīng)用場景?
137、在Python中使用過什么代碼檢查工具?
138、簡述 saltstack、ansible、fabric、puppet工具的作用?
139、B Tree和B+ Tree的區(qū)別?
140、請列舉常見排序并通過代碼實現(xiàn)任意三種。
141、請列舉常見查找并通過代碼實現(xiàn)任意三種。
142、請列舉你熟悉的設(shè)計模式?
143、有沒有刷過leetcode?
144、列舉熟悉的的Linux命令。
145、公司線上服務(wù)器是什么系統(tǒng)?
146、解釋 PV、UV 的含義?
147、解釋 QPS的含義?
148、uwsgi和wsgi的區(qū)別?
149、supervisor的作用?
150、什么是反向代理?
151、簡述SSH的整個過程。
152、有問題都去那些找解決方案?
153、是否有關(guān)注什么技術(shù)類的公眾號?
154、最近在研究什么新技術(shù)?
155、是否了解過領(lǐng)域驅(qū)動模型?
統(tǒng)計:80 + 34 + 46 + 155 = 315題