摘要:里,有兩種方法獲得一定范圍內(nèi)的數(shù)字返回一個(gè)列表,還有返回一個(gè)迭代器。在引用計(jì)數(shù)的基礎(chǔ)上,還可以通過(guò)標(biāo)記清除解決容器對(duì)象可能產(chǎn)生的循環(huán)引用的問(wèn)題。列舉常見的內(nèi)置函數(shù)的作用,過(guò)濾函數(shù),循環(huán)函數(shù)累積函數(shù)一行代碼實(shí)現(xiàn)乘法表。
1、為什么學(xué)習(xí)Python?
人生苦短?人間不值得?想想自己的初心吧!
2、通過(guò)什么途徑學(xué)習(xí)的Python?
官網(wǎng)、網(wǎng)上視頻、學(xué)習(xí)網(wǎng)站、論壇、大牛的輔導(dǎo)
3、Python和Java、PHP、C、C#、C++等其他語(yǔ)言的對(duì)比?
(1)、python代碼,簡(jiǎn)介,明確,優(yōu)雅,簡(jiǎn)單易懂
(2)、開發(fā)效率高
(3)、可擴(kuò)展性強(qiáng)
4、簡(jiǎn)述解釋型和編譯型編程語(yǔ)言?
解釋型:在執(zhí)行程序時(shí),計(jì)算機(jī)才一條一條的將代碼解釋成機(jī)器語(yǔ)言給計(jì)算機(jī)來(lái)執(zhí)行
編譯型:是把源程序的每一條語(yǔ)句都編譯成機(jī)器語(yǔ)言,并保存成二進(jìn)制文件,這樣計(jì)算機(jī)運(yùn)行該程序時(shí)可以直接以機(jī)器語(yǔ)言來(lái)運(yùn)行此程序,運(yùn)行速度很快。
5、Python解釋器種類以及特點(diǎn)?
Cpython,IPython,Jpython,pypy,Ironpython
Python是一門解釋器語(yǔ)言,代碼想運(yùn)行,必須通過(guò)解釋器執(zhí)行,Python存在多種解釋器,分別基于不同語(yǔ)言開發(fā),每個(gè)解釋器有不同的特點(diǎn),但都能正常運(yùn)行Python代碼,以下是常用的五種Python解釋器:
CPython:當(dāng) 從Python官方網(wǎng)站下載并安裝好Python2.7后,就直接獲得了一個(gè)官方版本的解
釋器:Cpython,這個(gè)解釋器是用C語(yǔ)言開發(fā)的,所以叫 CPython,在命名行下運(yùn)行python, 就是啟動(dòng)CPython解釋器,CPython是使用最廣的Python解釋器。
IPython:IPython是基于CPython之上的一個(gè)交互式解釋器,也就是說(shuō),IPython只是在交互方
式上有所增強(qiáng),但是執(zhí)行Python代碼的功能和CPython是完全一樣的,好比很多國(guó)產(chǎn)瀏覽器 雖然外觀不同,但內(nèi)核其實(shí)是調(diào)用了IE。
PyPy:PyPy是另一個(gè)Python解釋器,它的目標(biāo)是執(zhí)行速度,PyPy采用JIT技術(shù),
對(duì)Python代進(jìn)行動(dòng)態(tài)編譯,所以可以顯著提高 Python代碼的執(zhí)行速度。
Jython:Jython是運(yùn)行在Java平臺(tái)上的Python解釋器,可以直接把Python代碼編譯成Java字節(jié)碼執(zhí)行。
IronPython:IronPython和Jython類似,只不過(guò)IronPython是運(yùn)行在微軟.Net平臺(tái)上的Python解釋器,
可以直接把Python代碼編譯成.Net的字節(jié)碼。
在Python的解釋器中,使用廣泛的是CPython,對(duì)于Python的編譯,除了可以采用以上解釋器
進(jìn)行編譯外,技術(shù)高超的開發(fā)者還可以按照自己的需求自行編寫Python解釋器來(lái)執(zhí)行Python代碼,十分的方便!
6、位和字節(jié)的關(guān)系?
一個(gè)字節(jié)=8位
7、b、B、KB、MB、GB 的關(guān)系?
1B(字節(jié)) = 8b(位)
1KB = 1024B
1MB = 1024KB
1GB = 1024MB
8、請(qǐng)至少列舉5個(gè) PEP8 規(guī)范
(1)、縮進(jìn):每一級(jí)4個(gè)縮進(jìn)。連續(xù)跨行應(yīng)該使用圓括號(hào)或大括號(hào)或者使用懸掛縮進(jìn)。
(2)、代碼長(zhǎng)度約束
一行列數(shù):PEP8 規(guī)定最大為79列,如果拼接url很容易超限 一個(gè)函數(shù):不可以超過(guò)30行;直觀來(lái)講就是完整顯示一個(gè)函數(shù)一個(gè)屏幕就夠了,不需要上下拖動(dòng) 一個(gè)類:不要超過(guò)200行代碼,不要超過(guò)10個(gè)方法 一個(gè)模塊:不要超過(guò)500行
(3)、import
不要在一句import中引用多個(gè)庫(kù)
(4)、命名規(guī)范
(5)、注釋
總體原則,錯(cuò)誤的注釋不如沒(méi)有注釋。所以當(dāng)一段代碼發(fā)生變化時(shí),第一件事就是要修改注釋!
9、通過(guò)代碼實(shí)現(xiàn)如下轉(zhuǎn)換:
答案: 二進(jìn)制轉(zhuǎn)換成十進(jìn)制:v = “0b1111011”
print(int("0b1111011",2)) 十進(jìn)制轉(zhuǎn)換成二進(jìn)制:v = 18 print(bin(18)) 八進(jìn)制轉(zhuǎn)換成十進(jìn)制:v = “011” print(int("011",8)) 十進(jìn)制轉(zhuǎn)換成八進(jìn)制:v = 30 print(oct(30)) 十六進(jìn)制轉(zhuǎn)換成十進(jìn)制:v = “0x12” print(int("0x12",16)) 十進(jìn)制轉(zhuǎn)換成十六進(jìn)制:v = 87 print(hex(87))
10、請(qǐng)編寫一個(gè)函數(shù)實(shí)現(xiàn)將IP地址轉(zhuǎn)換成一個(gè)整數(shù)。
如 10.3.9.12 轉(zhuǎn)換規(guī)則為:
10 00001010 3 00000011 9 00001001 12 00001100
再將以上二進(jìn)制拼接起來(lái)計(jì)算十進(jìn)制結(jié)果:00001010 00000011 00001001 00001100 = ?
答案:
def func(x): lis = x.strip().split(".") li = [bin(int(i)) for i in lis] li2 = [i.replace("0b",(10-len(i))*"0") for i in li] return int("".join(li2),2) ret = func("10.3.9.12") print(ret)
11、python遞歸的最大層數(shù)?
一般計(jì)算機(jī)默認(rèn)的最大遞歸深度在1000左右,python最大遞歸深度一般在4000左右,跟計(jì)算
機(jī)的性能有關(guān)系,這個(gè)數(shù)不是一個(gè)定數(shù),可通過(guò)一下方式測(cè)試
import sys print(sys.getrecursionlimit()) print(sys.setrecursionlimit(10000))
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 Flase and 1----->False
13、ascii、unicode、utf-8、gbk 區(qū)別?
ASCII碼:使用一個(gè)字節(jié)編碼,所以它的范圍基本是只有英文字母、數(shù)字和一些特殊符號(hào) ,只有256個(gè)字符。
Unicode:能夠表示全世界所有的字節(jié)
GBK:是只用來(lái)編碼漢字的,GBK全稱《漢字內(nèi)碼擴(kuò)展規(guī)范》,使用雙字節(jié)編碼。
UTF-8:是一種針對(duì)Unicode的可變長(zhǎng)度字符編碼,又稱萬(wàn)國(guó)碼。
14、字節(jié)碼和機(jī)器碼的區(qū)別?
機(jī)器碼:是電腦CPU直接讀取運(yùn)行的機(jī)器指令,運(yùn)行速度最快,但是非常晦澀難懂
字節(jié)碼:是一種中間狀態(tài)(中間碼)的二進(jìn)制代碼(文件)。需要直譯器轉(zhuǎn)譯后才能成為機(jī)器碼。
15、三元運(yùn)算規(guī)則以及應(yīng)用場(chǎng)景?
規(guī)則:為真時(shí)的結(jié)果 if 判定條件 else 為假時(shí)的結(jié)果
`應(yīng)用場(chǎng)景:在賦值變量的時(shí)候,可以直接加判斷,然后賦值`
16、列舉 Python2和Python3的區(qū)別?
1、默認(rèn)編碼:2-->ascii,3-->utf-8
2、print的區(qū)別:python2中print是一個(gè)語(yǔ)句,不論想輸出什么,直接放到print關(guān)鍵字后面即可。python3里,print()是一個(gè)函數(shù),
像其他函數(shù)一樣,print()需要你將要輸出的東西作為參數(shù)傳給它。
3、input的區(qū)別:
python2有兩個(gè)全局函數(shù),用在命令行請(qǐng)求用戶輸入。第一個(gè)叫input(),它等待用戶輸入一個(gè)python表達(dá)式(然后返回結(jié)果)。 第二個(gè)叫做raw_input(),用戶輸入什么他就返回什么。python3 通過(guò)input替代了他們。
4、字符串:python2中有兩種字符串類型:Unicode字符串和非Unicode字符串。Python3中只有一種類型:Unicode字符串。
5、xrange()
python2里,有兩種方法獲得一定范圍內(nèi)的數(shù)字:range(),返回一個(gè)列表,還有xrange(),返回一個(gè)迭代器。 python3 里,range()返回迭代器,xrange()不再存在。
17、用一行代碼實(shí)現(xiàn)數(shù)值交換:
a = 1 b = 2
答案:a = 1
b = 2 a,b = b,a
18、Python3和Python2中 int 和 long的區(qū)別?
python2有非浮點(diǎn)數(shù)準(zhǔn)備的int和long類型。int類型最大
值不能超過(guò)sys.maxint,而且這個(gè)最大值是平臺(tái)相關(guān)的。
可以通過(guò)在數(shù)字的末尾附上一個(gè)L來(lái)定義長(zhǎng)整型,顯然,它比int類型表示的數(shù)字范圍更大。在python3里,
只有一種整數(shù)類型int,大多數(shù)情況下,和python2中的長(zhǎng)整型類似。
學(xué)習(xí)過(guò)程中會(huì)遇到很多問(wèn)題,你可以到我們的 python學(xué)習(xí) -q-u-n-784758214 ,基礎(chǔ),進(jìn)階。好友都會(huì)在里面交流,分享一些學(xué)習(xí)的方法和需要注意的小細(xì)節(jié),每天也會(huì)準(zhǔn)時(shí)講一些項(xiàng)目實(shí)戰(zhàn)案例。
19、xrange和range的區(qū)別?
python2里,有兩種方法獲得一定范圍內(nèi)的數(shù)字:range(),返回一個(gè)列表,還有xrange(),返回一個(gè)迭代器。
python3 里,range()返回迭代器,xrange()不再存在。
20、文件操作時(shí):xreadlines和readlines的區(qū)別?
readlines返回一個(gè)list,xreadlines方法返回一個(gè)生成器
21、列舉布爾值為False的常見值?
0, [] , () , {} , "" , False , None
22、字符串、列表、元組、字典每個(gè)常用的5個(gè)方法?
字符串:repleace,strip,split,reverse,upper,lower,join.....
列表:append,pop,insert,remove,sort,count,index.....
元組:index,count,__len__(),__dir__()
字典:get,keys,values,pop,popitems,clear,update,items.....
23、lambda表達(dá)式格式以及應(yīng)用場(chǎng)景?
表達(dá)式格式:lambda后面跟一個(gè)或多個(gè)參數(shù),緊跟一個(gè)冒號(hào),以后是一個(gè)表達(dá)式。冒號(hào)前是參數(shù),冒號(hào)后是返回值。例如:lambda x : 2x
應(yīng)用場(chǎng)景:經(jīng)常與一些內(nèi)置函數(shù)相結(jié)合使用,比如說(shuō)map(),filter(),sorted(),reduce()等
24、pass的作用?
1、空語(yǔ)句 do nothing
2、保證格式完整
3、保證語(yǔ)義完整
25、arg和*kwarg作用?
萬(wàn)能參數(shù),解決了函數(shù)參數(shù)不固定的問(wèn)題
*arg:會(huì)把位置參數(shù)轉(zhuǎn)化為tuple
**kwarg:會(huì)把關(guān)鍵字參數(shù)轉(zhuǎn)化為dict
26、is和==的區(qū)別?
is:判斷內(nèi)存地址是否相等
==:判斷數(shù)值是否相等
27、簡(jiǎn)述Python的深淺拷貝以及應(yīng)用場(chǎng)景?
copy():淺copy,淺拷貝指僅僅拷貝數(shù)據(jù)集合的第一層數(shù)據(jù)
deepcopy():深copy,深拷貝指拷貝數(shù)據(jù)集合的所有層
28、Python垃圾回收機(jī)制?
python采用的是引用計(jì)數(shù)機(jī)制為主,標(biāo)記-清除和分代收集(隔代回收、分代回收)兩種機(jī)制為輔的策略
計(jì)數(shù)機(jī)制
Python的GC模塊主要運(yùn)用了引用計(jì)數(shù)來(lái)跟蹤和回收垃圾。在引用計(jì)數(shù)的基礎(chǔ)上,還可以通過(guò)“標(biāo)記-清除” 解決容器對(duì)象可能產(chǎn)生的循環(huán)引用的問(wèn)題。通過(guò)分代回收以空間換取時(shí)間進(jìn)一步提高垃圾回收的效率。
標(biāo)記-清除:
標(biāo)記-清除的出現(xiàn)打破了循環(huán)引用,也就是它只關(guān)注那些可能會(huì)產(chǎn)生循環(huán)引用的對(duì)象 缺點(diǎn):該機(jī)制所帶來(lái)的額外操作和需要回收的內(nèi)存塊成正比。
隔代回收
原理:將系統(tǒng)中的所有內(nèi)存塊根據(jù)其存活時(shí)間劃分為不同的集合,每一個(gè)集合就成為一個(gè)“代”, 垃圾收集的頻率隨著“代”的存活時(shí)間的增大而減小。也就是說(shuō),活得越長(zhǎng)的對(duì)象,就越不可能是垃圾, 就應(yīng)該減少對(duì)它的垃圾收集頻率。那么如何來(lái)衡量這個(gè)存活時(shí)間:通常是利用幾次垃圾收集動(dòng)作來(lái)衡量, 如果一個(gè)對(duì)象經(jīng)過(guò)的垃圾收集次數(shù)越多,可以得出:該對(duì)象存活時(shí)間就越長(zhǎng)。
29、python的可變類型和不可變類型?
不可變類型(數(shù)字、字符串、元組、不可變集合)
可變類型(列表、字典、可變集合)
30、求結(jié)果:
v = dict.fromkeys(["k1","k2"],[])
v["k1"].append(666)
print(v)
v["k1"] = 777
print(v)
答案:{"k1":[666],"k2":[666]} {"k1":777,"k2":[666]} 解析:formkeys()默認(rèn)參數(shù)為可變數(shù)據(jù)類型時(shí)有坑
31、求結(jié)果:
def num(): return [lambda x: i*x for i in range(4)] print([m(2) for m in num()]) 答案:[6, 6, 6, 6] 解析: 問(wèn)題的本質(zhì)在與python中的屬性查找規(guī)則,LEGB(local,enclousing,global,bulitin), 在上面的例子中,i就是在閉包作用域(enclousing),而Python的閉包是 遲綁定 , 這意味著閉包中用到的變量的值,是在內(nèi)部函數(shù)被調(diào)用時(shí)查詢得到的 所以:[lambda x: i*x for i in range(4)]打印出來(lái)是含有四個(gè)內(nèi)存地址的列表,每個(gè)內(nèi)存地址中的i 在在本內(nèi)存中都沒(méi)有被定義,而是通過(guò)閉包作用域中的i值,當(dāng)for循環(huán)執(zhí)行結(jié)束后,i的值等于3,所以 再執(zhí)行[m(2) for m in num()]時(shí),每個(gè)內(nèi)存地址中的i值等于3,當(dāng)x等于2時(shí),打印出來(lái)的結(jié)果都是6, 從而得到結(jié)果[6, 6, 6, 6]。
32、列舉常見的內(nèi)置函數(shù)?
map,filter,zip,len,bin,oct,hex,int,float,bool,sum,min,max,str,list,tuple,dict,range,next,hash,help,id.....
33、filter、map、reduce的作用?
filter(function,iterable)過(guò)濾函數(shù)
map(function,iterable)循環(huán)函數(shù)
reduce(function, iterable)累積函數(shù)
34、一行代碼實(shí)現(xiàn)9*9乘法表。
lis = ["%s%s=%s"%(i,j,ij) for i in range(1,10) for j in range(i,10)]
35、如何安裝第三方模塊?以及用過(guò)哪些第三方模塊?
pip3 imstall 模塊名
django,Matplotlib,Tornado,PyGame
36、至少列舉8個(gè)常用模塊都有那些?
os,sys,time,random,re,hashlib,logging,json,pickle....
37、re的match和search區(qū)別?
match:從字符串的開頭位置匹配,必須以此為開頭
search:從開頭開始查,找到符合的就返回結(jié)果
38、什么是正則的貪婪匹配?
正則表達(dá)式一般趨向于最大長(zhǎng)度匹配
39、求結(jié)果:
a. [ i % 2 for i in range(10) ] ===>[0,1,0,1,0,1,0,1,0,1]
b. ( i % 2 for i in range(10) )===>返回一個(gè)生成器的內(nèi)存地址
40、求結(jié)果:
a. 1 or 2 =========>1
b. 1 and 2 ========>2
c. 1 < (2==2)======>false
d. 1 < 2 == 2======>ture
41、def func(a,b=[]) 這種寫法有什么坑?
def func(a,b=[]):
b.append(a) print(b)
函數(shù)的第二個(gè)默認(rèn)參數(shù)是一個(gè)list,當(dāng)?shù)谝淮螆?zhí)行的時(shí)候?qū)嵗艘粋€(gè)list,
第二次執(zhí)行還是用第一次執(zhí)行的時(shí)候?qū)嵗牡刂反鎯?chǔ),以后每次實(shí)例化都是
學(xué)習(xí)過(guò)程中會(huì)遇到很多問(wèn)題,你可以到我們的 python學(xué)習(xí) -q-u-n-784758214 ,基礎(chǔ),進(jìn)階。好友都會(huì)在里面交流,分享一些學(xué)習(xí)的方法和需要注意的小細(xì)節(jié),每天也會(huì)準(zhǔn)時(shí)講一些項(xiàng)目實(shí)戰(zhàn)案例。
42、如何實(shí)現(xiàn) "1,2,3" 變成 ["1","2","3"] ?
a = "1,2,3"
li = a.split(",")
43、如何實(shí)現(xiàn)[‘1’,’2’,’3’]變成[1,2,3] ?
li = ["1","2","3"]
lis = list(map(lambda x:int(x) li))
44、比較: a = [1,2,3] 和 b = [(1),(2),(3) ] 以及 b = [(1,),(2,),(3,) ] 的區(qū)別?
a = [1,2,3]正常的列表
b = [(1),(2),(3)] 雖然列表的每個(gè)元素加上了括號(hào),但是當(dāng)括號(hào)內(nèi)只有一個(gè)元素并且沒(méi)有逗號(hào)時(shí),其數(shù)據(jù)類型是元素本身的數(shù)據(jù)類型
b = [(1,),(2,),(3,)]列表中的元素類型都是元組類型
45、如何用一行代碼生成[1,4,9,16,25,36,49,64,81,100] ?
li = [x*x for x in range(1,11)]
46、一行代碼實(shí)現(xiàn)刪除列表中重復(fù)的值 ?
li = [1, 1, 1, 23, 3, 4, 4]
new_li = list(set(li))
new_li.sort(key=li.index)
47、如何在函數(shù)中設(shè)置一個(gè)全局變量 ?
使用python的內(nèi)置語(yǔ)法 globals 全局變量
48、logging模塊的作用?以及應(yīng)用場(chǎng)景?
logging模塊的作用:
1、程序調(diào)試
2、了解軟件程序運(yùn)行情況,是否正常
3、軟件程序運(yùn)行故障分析與問(wèn)題定位
應(yīng)用場(chǎng)景:網(wǎng)站的運(yùn)維工作,程序?qū)崟r(shí)監(jiān)控
49、請(qǐng)用代碼簡(jiǎn)答實(shí)現(xiàn)stack 。
def Stack(object):
def __init__(self): self.stack = [] def push(self,value): # 進(jìn)棧 self.stack.append(value) def pop(self): # 出棧 if self.stack: self.stack.pop() else: raise LookupError("stack is empty!") def is_empty(self): # 查看stack是否為空 reture bool(self.stack) def top(self): # 取出stack中最新的值 return self.stack[-1]
50、常用字符串格式化哪幾種?
1、%s %d
2、format格式化輸出
3、print(f"內(nèi)容{變量名}")
51、簡(jiǎn)述 生成器、迭代器、可迭代對(duì)象 以及應(yīng)用場(chǎng)景?
生成器:在 Python 中,一邊循環(huán)一邊計(jì)算的機(jī)制,稱為 生成器(generator),
通過(guò)next()取值,兩種表現(xiàn)形式1、將列表生成式的[]改為()2、含有yield關(guān)鍵字的函數(shù) 應(yīng)用場(chǎng)景:優(yōu)化代碼,節(jié)省內(nèi)存
迭代器:是訪問(wèn)集合元素的一種方式。迭代器同時(shí)實(shí)現(xiàn)了__iter__和__next__方法
可迭代對(duì)象:只要實(shí)現(xiàn)了__iter__方法的對(duì)象就是可迭代對(duì)象
52、用Python實(shí)現(xiàn)一個(gè)二分查找的函數(shù)。
lis = [0, 1, 3, 4, 5, 6, 7, 9, 10, 11,12,16,17]
def two_find(x, lis, start=0, end=None):
if end == None:end = len(lis) - 1 num = (end - start) // 2 + start if end > start: if lis[num] > x: return two_find(x, lis, start=start, end=num) elif lis[num] < x: return two_find(x, lis, start=num + 1, end=end) elif lis[num] == x: return num elif lis[end] == x:return end else:return None
print(two_find(17, lis))
53、談?wù)勀銓?duì)閉包的理解?
在一個(gè)外函數(shù)中定義了一個(gè)內(nèi)函數(shù),內(nèi)函數(shù)里運(yùn)用了外函數(shù)的臨時(shí)變量,并且外函數(shù)的返回值是內(nèi)函數(shù)的引用。這樣就構(gòu)成了一個(gè)閉包。
一般情況下,在我們認(rèn)知當(dāng)中,如果一個(gè)函數(shù)結(jié)束,函數(shù)的內(nèi)部所有東西都會(huì)釋放掉,還給內(nèi)存,局部變量都會(huì)消失。
但是閉包是一種特殊情況,如果外函數(shù)在結(jié)束的時(shí)候發(fā)現(xiàn)有自己的臨時(shí)變量將來(lái)會(huì)在內(nèi)部函數(shù)中用到,就把這個(gè)臨時(shí)變量綁定給了內(nèi)部函數(shù),然后自己再結(jié)束。
54、os和sys模塊的作用?
os模塊負(fù)責(zé)程序與操作系統(tǒng)的交互,提供了訪問(wèn)操作系統(tǒng)底層的接口;
sys模塊負(fù)責(zé)程序與python解釋器的交互,提供了一系列的函數(shù)和變量,用于操控python的運(yùn)行時(shí)環(huán)境。
55、如何生成一個(gè)隨機(jī)數(shù)?
import random
def rdm(n):
lis = [] for i in range(n): n = random.randint(1,9) lis.append(str(n)) s = "".join(lis) return int(s)
56、如何使用python刪除一個(gè)文件?
import os
os.remove(r"path")
57、談?wù)勀銓?duì)面向?qū)ο蟮睦斫猓?/p>
面向?qū)ο蟮某绦蛟O(shè)計(jì)的核心是對(duì)象(上帝式思維),要理解對(duì)象為何物,必須把自己當(dāng)成上帝,上帝眼里世間存在的萬(wàn)物皆為對(duì)象,
不存在的也可以創(chuàng)造出來(lái)。對(duì)象是特征和技能的結(jié)合,其中特征和技能分別對(duì)應(yīng)對(duì)象的數(shù)據(jù)屬性和方法屬性。
優(yōu)點(diǎn)是:解決了程序的擴(kuò)展性。對(duì)某一個(gè)對(duì)象多帶帶修改,會(huì)立刻反映到整個(gè)體系中,如對(duì)游戲中一個(gè)人物參數(shù)的特征和技能修改都很容易。
缺點(diǎn):可控性差,無(wú)法向面向過(guò)程的程序設(shè)計(jì)流水線式的可以很精準(zhǔn)的預(yù)測(cè)問(wèn)題的處理流程與結(jié)果,
面向?qū)ο蟮某绦蛞坏╅_始就由對(duì)象之間的交互解決問(wèn)題,即便是上帝也無(wú)法預(yù)測(cè)最終結(jié)果。
應(yīng)用場(chǎng)景:需求經(jīng)常變化的軟件,一般需求的變化都集中在用戶層,互聯(lián)網(wǎng)應(yīng)用,企業(yè)內(nèi)部軟件,游戲等都是面向?qū)ο蟮某绦蛟O(shè)計(jì)大顯身手的好地方。
58、Python面向?qū)ο笾械睦^承有什么特點(diǎn)?
1:在繼承中基類的構(gòu)造(__init__()方法)不會(huì)被自動(dòng)調(diào)用,它需要在其派生類的構(gòu)造中親自專門調(diào)用。
2:在調(diào)用基類的方法時(shí),需要加上基類的類名前綴,且需要帶上self參數(shù)變量。
區(qū)別于在類中調(diào)用普通函數(shù)時(shí)并不需要帶上self參數(shù)
3:Python總是首先查找對(duì)應(yīng)類型的方法,如果它不能在派生類中找到對(duì)應(yīng)的方法,它才開始到基類中逐個(gè)查找。
(先在本類中查找調(diào)用的方法,找不到才去基類中找)。
59、面向?qū)ο笊疃葍?yōu)先和廣度優(yōu)先是什么?
Python的類可以繼承多個(gè)類,那么其尋找類方法的方式有兩種:
當(dāng)類是經(jīng)典類時(shí)(主要在python2版本中的沒(méi)有主動(dòng)繼承object的類),多繼承情況下,會(huì)按照深度優(yōu)先方式查找 當(dāng)類是新式類時(shí)(python3版本中的所有類和python2中主動(dòng)繼承object的類),多繼承情況下,會(huì)按照廣度優(yōu)先方式查找 簡(jiǎn)單點(diǎn)說(shuō)就是:經(jīng)典類是縱向查找,新式類是橫向查找
60、面向?qū)ο笾衧uper的作用?
1、super在面向?qū)ο罄^承類中代指父類,書寫方法super(類名,self).屬性或者方法或super().屬性或者方法
2、super方法可以增加類之間調(diào)用的靈活性,當(dāng)父類名發(fā)生變化時(shí)不必修改
3、super方法在類的多繼承時(shí)可以簡(jiǎn)化代碼,避免代碼冗余
4、super機(jī)制里可以保證公共父類僅被執(zhí)行一次,執(zhí)行的順序遵循MRO,廣度優(yōu)先查詢方法
61、是否使用過(guò)functools中的函數(shù)?其作用是什么?
functools用于高階函數(shù):指那些作用于函數(shù)或者返回其他函數(shù)的函數(shù)。通常情況下,只要是
可以被當(dāng)做函數(shù)調(diào)用的對(duì)象就是這個(gè)模塊的目標(biāo)。
62、列舉面向?qū)ο笾袔щp下劃線的特殊方法,如:new、init
__new__:構(gòu)造方法,創(chuàng)建一個(gè)對(duì)象,實(shí)例化時(shí)第一個(gè)被執(zhí)行,返回一個(gè)創(chuàng)建好的對(duì)象及__init__(self)的self,
只有繼承了object的類才會(huì)有這個(gè)方法
__init__:初始化方法,__init__在__new__的基礎(chǔ)上完成一些其它初始化的動(dòng)作,__init__沒(méi)有返回值
63、如何判斷是函數(shù)還是方法?
函數(shù)和方法都封裝了一些獨(dú)立的功能,如果在類中定義的函數(shù)那就是方法(對(duì)象或者類名點(diǎn)方法名調(diào)用),
否則就是函數(shù)(函數(shù)名()直接調(diào)用)
64、靜態(tài)方法和類方法區(qū)別?
靜態(tài)方法:是既不是用類中的屬性又不使用對(duì)象中的屬性,由類或者對(duì)象調(diào)用的方法,依賴python裝飾器@staticmethod來(lái)實(shí)現(xiàn)
類方法:只使用類中的靜態(tài)變量,一般都是由類調(diào)用,依賴python裝飾器@classmethod來(lái)實(shí)現(xiàn)
65、列舉面向?qū)ο笾械奶厥獬蓡T以及應(yīng)用場(chǎng)景?
__call__:對(duì)象的構(gòu)造方法,對(duì)象加上(),可以觸發(fā)這個(gè)類的__call__方法。
__len__:內(nèi)置函數(shù)的len函數(shù)是依賴類中的__len__方法
__eq__:判斷值是否相等的時(shí)候依賴__eq__方法
__hash__:判斷hash值是否相等的時(shí)候依賴__hash__方法(拓展:set的去重機(jī)制其實(shí)就是根據(jù)__hash__和__eq__方法實(shí)現(xiàn)的)
__str__:和str() print() %s 都是息息相關(guān)的,返回值一定是字符串類型
__repr__:和 repr() %r都是息息相關(guān)的,在沒(méi)有__str__方法時(shí),__repr__可以完全取代__str__。
del 析構(gòu)方法,對(duì)應(yīng)著一個(gè)對(duì)象的刪除之前執(zhí)行的內(nèi)容
66、1、2、3、4、5 能組成多少個(gè)互不相同且無(wú)重復(fù)的三位數(shù)
count = 0
for i in range(1,6):
for j in range(1,6): for k in range(1,6): if (i != j) and (i != k) and (j != k): count += 1 if count % 6: print(f"{i}{j}{k}", end="|") else: print(f"{i}{j}{k}")
print(count)
67、什么是反射?以及應(yīng)用場(chǎng)景?
定義:通過(guò)用字符串?dāng)?shù)據(jù)類型的變量名來(lái)訪問(wèn)這個(gè)變量的值,在python面向?qū)ο笾械姆瓷?通過(guò)字符串的形式操作對(duì)象相關(guān)的屬性或方法.
應(yīng)用場(chǎng)景:用于處理通過(guò)用戶輸入,文件讀取,或者網(wǎng)絡(luò)傳輸所得到的字符串形式的指令來(lái)完成對(duì)應(yīng)的操作
68、metaclass作用?以及應(yīng)用場(chǎng)景?
metaclass,直譯為元類,簡(jiǎn)單的解釋就是:當(dāng)我們定義了類以后,就可以根據(jù)這個(gè)類創(chuàng)建出實(shí)例,
所以:先定義類,然后創(chuàng)建實(shí)例。但是如果我們想創(chuàng)建出類呢?那就必須根據(jù)metaclass創(chuàng)建出類,
所以:先定義metaclass,然后創(chuàng)建類。換句話說(shuō),你可以把類看成是metaclass創(chuàng)建出來(lái)的“實(shí)例”
69、用盡量多的方法實(shí)現(xiàn)單例模式。
1、基于__new__()方法
class Person: def __new__(cls, *args, **kwargs): if not hasattr(cls,cls._instance): # cls._instance = object.__new__(cls) cls._instance = super().__new__(cls) return cls._instance
2、基于模塊導(dǎo)入方式,現(xiàn)在一個(gè)py文件中寫好一個(gè)類,實(shí)例化一個(gè)對(duì)象。以后用這個(gè)類直接導(dǎo)入這個(gè)模塊就是單例模式。
3、基于裝飾器方法實(shí)現(xiàn)
def singleton(cls, *args, **kwargs): instance_dic = {} def inner(*args, **kwargs): if cls not in instance_dic: instance_dic["cls"] = cls(*args, **kwargs) return instance_dic["cls"] return inner @singleton class Person: pass
70、裝飾器的寫法以及應(yīng)用場(chǎng)景。
裝飾器的寫法:
def wrapper(func): def inner(*args,**kwargs): "被裝飾之前的操作" ret = func(*args,**kwargs) "被裝飾之后的操作" return ret return inner
裝飾器的應(yīng)用場(chǎng)景:
比如注冊(cè)登錄、插入日志,性能測(cè)試,事務(wù)處理,緩存等等場(chǎng)景
71、異常處理寫法以及如何主動(dòng)跑出異常(應(yīng)用場(chǎng)景)
異常處理的常規(guī)寫法:
try: 執(zhí)行的主體函數(shù) except Exception as e: print(str(e)) 主動(dòng)拋出異常: raise TypeError("出現(xiàn)了不可思議的異常")#TypeError可以是任意的錯(cuò)誤類型
72、什么是面向?qū)ο蟮膍ro
MRO(Method Resolution Order 方法解析順序)是面向?qū)ο笾杏糜诓樵冾惖亩嗬^承的繼承順序的方法, 它是基于算法來(lái)實(shí)現(xiàn)的,不同的算法實(shí)現(xiàn)的MRO的順序不同
73、isinstance作用以及應(yīng)用場(chǎng)景?
isinstance作用是來(lái)判斷一個(gè)對(duì)象是否是一個(gè)已知的類型
74、寫代碼并實(shí)現(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]
代碼實(shí)現(xiàn)
def func(li,target):
try: for i in range(0,len(li)): num = target-li[i] if num in li: return [i,li.index(num)] except:print("li類型為數(shù)組類型,內(nèi)的元素需是整型,target也為整型,請(qǐng)檢查") else:return None
75、json序列化時(shí),可以處理的數(shù)據(jù)類型有哪些?如何定制支持datetime類型?
1、可以處理的數(shù)據(jù)類型是 string、int、list、tuple、dict、bool、null
2、定制支持datetime類型
--------------------------官方文檔的memo-----------------------------------------------
>>> import json >>> class ComplexEncoder(json.JSONEncoder): ... def default(self, obj): ... if isinstance(obj, complex): ... return [obj.real, obj.imag] ... return json.JSONEncoder.default(self, obj) ... >>> dumps(2 + 1j, cls=ComplexEncoder) "[2.0, 1.0]" >>> ComplexEncoder().encode(2 + 1j) "[2.0, 1.0]" >>> list(ComplexEncoder().iterencode(2 + 1j)) ["[", "2.0", ", ", "1.0", "]"]
import json import datetime ret = datetime.datetime.now() class CJsonEncoder(json.JSONEncoder): def default(self, obj): if isinstance(obj, datetime.date): return obj.strftime("%Y-%m-%d %H:%M:%S") else: return json.JSONEncoder.default(self, obj) print(json.dumps(ret,cls=CJsonEncoder))
76、json序列化時(shí),默認(rèn)遇到中文會(huì)轉(zhuǎn)換成unicode,如果想要保留中文怎么辦?
在序列化是將json.dumps中的默認(rèn)參數(shù)ensure_ascii改為False就可以保留中文了
json.dumps(obj,ensure_ascii=False)
學(xué)習(xí)過(guò)程中會(huì)遇到很多問(wèn)題,你可以到我們的 python學(xué)習(xí) -q-u-n-784758214 ,基礎(chǔ),進(jìn)階。好友都會(huì)在里面交流,分享一些學(xué)習(xí)的方法和需要注意的小細(xì)節(jié),每天也會(huì)準(zhǔn)時(shí)講一些項(xiàng)目實(shí)戰(zhàn)案例。
77、什么是斷言?應(yīng)用場(chǎng)景?
assert 條件,"自定義錯(cuò)誤提示(可有可無(wú))" 例:assert 1 == 0,"這是一個(gè)低級(jí)的錯(cuò)誤"
合約式設(shè)計(jì)是斷言的經(jīng)典應(yīng)用,在一個(gè)正確的程序里,所有的前置條件和后置條件都將得到處理。
78、使用代碼實(shí)現(xiàn)查看列舉目錄下的所有文件。
方法一:遞歸處理
import os url = r"C:UsersMr.WangPycharmProjectsuntitled前段學(xué)習(xí)" def check_file(url,li = []): if os.path.isdir(url): file_list = os.listdir(url) for ret in file_list: base_url = os.path.join(url,ret) if os.path.isfile(base_url): li.append(ret) else: check_file(base_url) return li else:return os.path.basename(url)
方法二:堆棧的思想處理
import os url = r"C:UsersMr.WangPycharmProjectsuntitledpython基礎(chǔ)" lis = [url] while lis: url = lis.pop() ret_list = os.listdir(url) for name in ret_list: abs_path = os.path.join(url,name) if os.path.isdir(abs_path): lis.append(abs_path) else:print(name)
79、簡(jiǎn)述 yield和yield from關(guān)鍵字。
yield 是一個(gè)類似 return 的關(guān)鍵字,只是這個(gè)函數(shù)返回的是個(gè)生成器當(dāng)你調(diào)用這個(gè)函數(shù)的時(shí)候,
函數(shù)內(nèi)部的代碼并不立馬執(zhí)行 ,這個(gè)函數(shù)只是返回一個(gè)生成器對(duì)象,當(dāng)你使用for進(jìn)行迭代的時(shí)候,
函數(shù)中的代碼才會(huì)執(zhí)行
yield from 的主要功能是打開雙向通道,把最外層的調(diào)用方與最內(nèi)層的子生成器連接起來(lái),
這樣二者可以直接發(fā)送和產(chǎn)出值,還可以直接傳入異常,而不用在位于中間的協(xié)程中添加大量處理異常的樣板代碼。
有了這個(gè)結(jié)構(gòu),協(xié)程可以通過(guò)以前不可能的方式委托職責(zé)。
80、代碼實(shí)現(xiàn)六位隨機(jī)驗(yàn)證碼
import random s = "" for i in range(6): num = random.randint(0,9) alpha1 = chr(random.randint(65,90)) alpha2 = chr(random.randint(97,122)) ret = random.choice([num,alpha1,alpha2]) s += str(ret) print(s)
81、代碼實(shí)現(xiàn)隨機(jī)發(fā)紅包功能
import random def red_packge(money,num): li = random.sample(range(1,money*100),num-1) li.extend([0,money*100]) li.sort() return [(li[index+1]-li[index])/100 for index in range(num)] ret = red_packge(100,10) print(ret) --------------------------生成器版------------------------------------------- import random def red_packge(money,num): li = random.sample(range(1,money*100),num-1) li.extend([0,money*100]) li.sort() for index in range(num): yield (li[index+1]-li[index])/100 ret = red_packge(100,10) print(ret)
82、請(qǐng)盡可能列舉python列表的成員方法,并給出列表操作的答案:
(1) a=[1, 2, 3, 4, 5], a[::2]=? a[-2:]=? a[::2]=[1,3,5], a[-2:] = [4,5] (2)一行代碼實(shí)現(xiàn)對(duì)列表a中的偶數(shù)位置的元素進(jìn)行加3后求和? sum([i+3 for i in a[::2]]) (3)將列表a的元素順序打亂,再對(duì)a進(jìn)行排序得到列表b,然后把a(bǔ)和b按元素順序構(gòu)造一個(gè)字典d。 import random random.shuffle(a) b=a.sort() d={} for i in range(len(a)):d[a[i]] = b[i]
83、Python自省
自省就是面向?qū)ο蟮恼Z(yǔ)言所寫的程序在運(yùn)行時(shí),就能知道對(duì)象的類型。也就是程序運(yùn)行時(shí)能夠獲得對(duì)象的類型。比如type(),dir(),getattr(),hasattr(),isinstance()。
84、Python是如何進(jìn)行內(nèi)存管理的?
從三個(gè)方面來(lái)說(shuō),一對(duì)象的引用計(jì)數(shù)機(jī)制,二垃圾回收機(jī)制,三內(nèi)存池機(jī)制
一、對(duì)象的引用計(jì)數(shù)機(jī)制
Python內(nèi)部使用引用計(jì)數(shù),來(lái)保持追蹤內(nèi)存中的對(duì)象,所有對(duì)象都有引用計(jì)數(shù)。
引用計(jì)數(shù)增加的情況:
1,一個(gè)對(duì)象分配一個(gè)新名稱
2,將其放入一個(gè)容器中(如列表、元組或字典)
引用計(jì)數(shù)減少的情況:
1,使用del語(yǔ)句對(duì)對(duì)象別名顯示的銷毀
2,引用超出作用域或被重新賦值
sys.getrefcount( )函數(shù)可以獲得對(duì)象的當(dāng)前引用計(jì)數(shù)
多數(shù)情況下,引用計(jì)數(shù)比你猜測(cè)得要大得多。對(duì)于不可變數(shù)據(jù)(如數(shù)字和字符串),解釋器會(huì)在程序的不同部分共享內(nèi)存,以便節(jié)約內(nèi)存。
二、垃圾回收
1,當(dāng)一個(gè)對(duì)象的引用計(jì)數(shù)歸零時(shí),它將被垃圾收集機(jī)制處理掉。
2,當(dāng)兩個(gè)對(duì)象a和b相互引用時(shí),del語(yǔ)句可以減少a和b的引用計(jì)數(shù),并銷毀用于引用底層對(duì)象的名稱。然而由于每個(gè)對(duì)象都包含一個(gè)對(duì)其他對(duì)象的應(yīng)用,因此引用計(jì)數(shù)不會(huì)歸零,對(duì)象也不會(huì)銷毀。(從而導(dǎo)致內(nèi)存泄露)。為解決這一問(wèn)題,解釋器會(huì)定期執(zhí)行一個(gè)循環(huán)檢測(cè)器,搜索不可訪問(wèn)對(duì)象的循環(huán)并刪除它們。
三、內(nèi)存池機(jī)制
Python提供了對(duì)內(nèi)存的垃圾收集機(jī)制,但是它將不用的內(nèi)存放到內(nèi)存池而不是返回給操作系統(tǒng)。
1,Pymalloc機(jī)制。為了加速Python的執(zhí)行效率,Python引入了一個(gè)內(nèi)存池機(jī)制,用于管理對(duì)小塊內(nèi)存的申請(qǐng)和釋放。
2,Python中所有小于256個(gè)字節(jié)的對(duì)象都使用pymalloc實(shí)現(xiàn)的分配器,而大的對(duì)象則使用系統(tǒng)的malloc。
3,對(duì)于Python對(duì)象,如整數(shù),浮點(diǎn)數(shù)和List,都有其獨(dú)立的私有內(nèi)存池,對(duì)象間不共享他們的內(nèi)存池。也就是說(shuō)如果你分配又釋放了大量的整數(shù),用于緩存這些整數(shù)的內(nèi)存就不能再分配給浮點(diǎn)數(shù)。
85、介紹一下except的用法和作用?
try…except…except…else…
-- 執(zhí)行try下的語(yǔ)句,如果引發(fā)異常,則執(zhí)行過(guò)程會(huì)跳到except語(yǔ)句。對(duì)每個(gè)except分支順序嘗試執(zhí)行,如果引發(fā)的異常與except中的異常組匹配,執(zhí)行相應(yīng)的語(yǔ)句。如果所有的except都不匹配,則異常會(huì)傳遞到下一個(gè)調(diào)用本代碼的最高層try代碼中。
-- try下的語(yǔ)句正常執(zhí)行,則執(zhí)行else塊代碼。如果發(fā)生異常,就不會(huì)執(zhí)行
-- 如果存在finally語(yǔ)句,最后總是會(huì)執(zhí)行。
86、如何用Python來(lái)進(jìn)行查詢和替換一個(gè)文本字符串?
可以使用re模塊中的sub()函數(shù)或者subn()函數(shù)來(lái)進(jìn)行查詢和替換,比replace的功能更強(qiáng)大!!!
格式:sub(replacement, string[,count=0])(replacement是被替換成的文本,string是需要被替換的文本,count是一個(gè)可選參數(shù),指最大被替換的數(shù)量)
import re p=re.compile("blue|white|red") print(p.sub("colour","blue socks and red shoes")) print(p.sub("colour","blue socks and red shoes",count=1))
subn()方法執(zhí)行的效果跟sub()一樣,不過(guò)它會(huì)返回一個(gè)二維數(shù)組,包括替換后的新的字符串和總共替換的數(shù)量
87、有沒(méi)有一個(gè)工具可以幫助查找python的bug和進(jìn)行靜態(tài)的代碼分析?
PyChecker是一個(gè)python代碼的靜態(tài)分析工具,它可以幫助查找python代碼的bug, 會(huì)對(duì)代碼的復(fù)雜度和格式提出警告
Pylint是另外一個(gè)工具可以進(jìn)行codingstandard檢查
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/43895.html
摘要:在線挑戰(zhàn),還沒(méi)用過(guò),貌似現(xiàn)在對(duì)英文資料心里還有種抵觸,必須克服實(shí)驗(yàn)樓研發(fā)工程師包含了等學(xué)習(xí)課程。書的作者就是開發(fā)了用于數(shù)據(jù)分析的著名開源庫(kù)的作者英文資料,對(duì)數(shù)據(jù)分析中要用到的一些庫(kù),等等做了簡(jiǎn)要介紹。形式的資料,示例代碼都很全。 showImg(https://segmentfault.com/img/remote/1460000004852849); 一、說(shuō)明 面對(duì)網(wǎng)絡(luò)上紛繁復(fù)雜的資...
摘要:自制力好的人,估計(jì)在保存后會(huì)翻出來(lái)看兩眼,過(guò)幾天又忘得一干二凈了。多思考學(xué)會(huì)思考,養(yǎng)成多思考的習(xí)慣。以項(xiàng)目來(lái)驅(qū)動(dòng)自己學(xué)習(xí),整個(gè)過(guò)程將會(huì)有趣得多。后語(yǔ)以上就是我對(duì)自學(xué)的幾點(diǎn)建議,希望對(duì)你們有幫助。 微信公眾號(hào):一個(gè)優(yōu)秀的廢人如有問(wèn)題或建議,請(qǐng)后臺(tái)留言,我會(huì)盡力解決你的問(wèn)題。 showImg(https://segmentfault.com/img/remote/1460000018208...
摘要:大家好,我是一行今天給大家聊聊一行在讀研里最成功的投資,那必然是鍵盤邊上的每一本技術(shù)書啦畢竟股票基金這種投資即使賺了錢,過(guò)段時(shí)間就得還回去,非常的神奇但是讀過(guò)的每一本技術(shù)書籍,都內(nèi)化在手指上了,只要給個(gè)鍵盤,就能給它實(shí) ...
摘要:它需要將近美元才能買到,但是你可以下載免費(fèi)的和版本。在需要花費(fèi)美元來(lái)開始你的學(xué)習(xí),將會(huì)有超過(guò)頁(yè)的內(nèi)容和個(gè)多小時(shí)的視頻供你訪問(wèn),還包括以后可以免費(fèi)更新。 showImg(https://segmentfault.com/img/bVrJpw); 用Python編寫代碼一點(diǎn)都不難,事實(shí)上它一直被贊譽(yù)為最容易學(xué)的編程語(yǔ)言。如果你準(zhǔn)備學(xué)習(xí)web開發(fā), Python是一個(gè)不錯(cuò)的開始,甚至想做游戲...
閱讀 2229·2021-11-22 13:52
閱讀 3870·2021-11-10 11:36
閱讀 1415·2021-09-24 09:47
閱讀 1094·2019-08-29 13:54
閱讀 3367·2019-08-29 13:46
閱讀 1946·2019-08-29 12:16
閱讀 2116·2019-08-26 13:26
閱讀 3475·2019-08-23 17:10