【測試題】python自測100題凿滤,來看看你和月薪3萬的差距(含答案)

《python江湖》微信平臺,專注python學(xué)習(xí)交流庶近,不定期分享干貨學(xué)習(xí)資源翁脆,歡迎python愛好者關(guān)注!輸入“PY”獲取200G視頻學(xué)習(xí)資料+70本入門到精通PDF鼻种。

學(xué)習(xí).gif

1反番、為什么學(xué)習(xí)Python?

人生苦短叉钥?人間不值得罢缸?想想自己的初心吧!

2沼侣、通過什么途徑學(xué)習(xí)的Python祖能?

官網(wǎng)、網(wǎng)上視頻蛾洛、學(xué)習(xí)網(wǎng)站养铸、論壇、大牛的輔導(dǎo)

3轧膘、Python和Java钞螟、PHP、C谎碍、C#鳞滨、C++等其他語言的對比?

(1)蟆淀、python代碼拯啦,簡介,明確熔任,優(yōu)雅褒链,簡單易懂
(2)、開發(fā)效率高
(3)疑苔、可擴展性強

4甫匹、簡述解釋型和編譯型編程語言?

解釋型:在執(zhí)行程序時,計算機才一條一條的將代碼解釋成機器語言給計算機來執(zhí)行
編譯型:是把源程序的每一條語句都編譯成機器語言兵迅,并保存成二進制文件抢韭,這樣計算機運行該程序時可以直接以機器語言來運行此程序,運行速度很快恍箭。

5刻恭、Python解釋器種類以及特點?

Cpython季惯,IPython吠各,Jpython,pypy勉抓,Ironpython

Python是一門解釋器語言贾漏,代碼想運行,必須通過解釋器執(zhí)行藕筋,Python存在多種解釋器纵散,分別基于不同語言開發(fā),每個解釋器有不同的特點隐圾,但都能正常運行Python代碼伍掀,以下是常用的五種Python解釋器:

CPython:當 從Python官方網(wǎng)站下載并安裝好Python2.7后,就直接獲得了一個官方版本的解釋器:Cpython暇藏,這個解釋器是用C語言開發(fā)的蜜笤,所以叫 CPython,在命名行下運行python盐碱,就是啟動CPython解釋器把兔,CPython是使用最廣的Python解釋器。

IPython:IPython是基于CPython之上的一個交互式解釋器瓮顽,也就是說县好,IPython只是在交互方式上有所增強,但是執(zhí)行Python代碼的功能和CPython是完全一樣的暖混,好比很多國產(chǎn)瀏覽器雖然外觀不同缕贡,但內(nèi)核其實是調(diào)用了IE。

PyPy:PyPy是另一個Python解釋器拣播,它的目標是執(zhí)行速度晾咪,PyPy采用JIT技術(shù),對Python代進行動態(tài)編譯贮配,所以可以顯著提高Python代碼的執(zhí)行速度谍倦。

Jython:Jython是運行在Java平臺上的Python解釋器,可以直接把Python代碼編譯成Java字節(jié)碼執(zhí)行牧嫉。
IronPython:IronPython和Jython類似剂跟,只不過IronPython是運行在微軟.Net平臺上的Python解釋器,可以直接把Python代碼編譯成.Net的字節(jié)碼酣藻。

在Python的解釋器中曹洽,使用廣泛的是CPython,對于Python的編譯辽剧,除了可以采用以上解釋器進行編譯外送淆,技術(shù)高超的開發(fā)者還可以按照自己的需求自行編寫Python解釋器來執(zhí)行Python代碼,十分的方便怕轿!

6偷崩、位和字節(jié)的關(guān)系?

一個字節(jié)=8位

7撞羽、b阐斜、B、KB诀紊、MB谒出、GB 的關(guān)系?

1B(字節(jié)) = 8b(位)
1KB = 1024B
1MB = 1024KB
1GB = 1024MB

8邻奠、請至少列舉5個 PEP8 規(guī)范

(1)笤喳、縮進:每一級4個縮進。連續(xù)跨行應(yīng)該使用圓括號或大括號或者使用懸掛縮進碌宴。
(2)杀狡、代碼長度約束
一行列數(shù):PEP8 規(guī)定最大為79列,如果拼接url很容易超限
一個函數(shù):不可以超過30行贰镣;直觀來講就是完整顯示一個函數(shù)一個屏幕就夠了呜象,不需要上下拖動
一個類:不要超過200行代碼,不要超過10個方法
一個模塊:不要超過500行
(3)八孝、import

不要在一句import中引用多個庫
(4)董朝、命名規(guī)范
(5)、注釋

總體原則干跛,錯誤的注釋不如沒有注釋子姜。所以當一段代碼發(fā)生變化時,第一件事就是要修改注釋楼入!

9哥捕、通過代碼實現(xiàn)如下轉(zhuǎn)換:

答案: 二進制轉(zhuǎn)換成十進制:v = “0b1111011”

    print(int('0b1111011',2))    十進制轉(zhuǎn)換成二進制;
v = 18    print(bin(18))    八進制轉(zhuǎn)換成十進制:
v = “011”    print(int('011',8))    十進制轉(zhuǎn)換成八進制:
v = 30    print(oct(30))    十六進制轉(zhuǎn)換成十進制:
v = “0x12”    print(int('0x12',16))    十進制轉(zhuǎn)換成十六進制:
v = 87    print(hex(87))

10嘉熊、請編寫一個函數(shù)實現(xiàn)將IP地址轉(zhuǎn)換成一個整數(shù)遥赚。

如 10.3.9.12 轉(zhuǎn)換規(guī)則為:

10            00001010 3            00000011 9            0000100112            00001100

再將以上二進制拼接起來計算十進制結(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ù)凫佛?

一般計算機默認的最大遞歸深度在1000左右讲坎,python最大遞歸深度一般在4000左右,跟計算
機的性能有關(guān)系愧薛,這個數(shù)不是一個定數(shù)晨炕,可通過一下方式測試

import sys<br style="margin: 0px; padding: 0px;">print(sys.getrecursionlimit())
<br style="margin: 0px; padding: 0px;">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碼:使用一個字節(jié)編碼,所以它的范圍基本是只有英文字母进陡、數(shù)字和一些特殊符號 愿阐,只有256個字符。
Unicode:能夠表示全世界所有的字節(jié)
GBK:是只用來編碼漢字的趾疚,GBK全稱《漢字內(nèi)碼擴展規(guī)范》换况,使用雙字節(jié)編碼。
UTF-8:是一種針對Unicode的可變長度字符編碼盗蟆,又稱萬國碼戈二。

14、字節(jié)碼和機器碼的區(qū)別喳资?

機器碼:是電腦CPU直接讀取運行的機器指令觉吭,運行速度最快,但是非称偷耍晦澀難懂
字節(jié)碼:是一種中間狀態(tài)(中間碼)的二進制代碼(文件)鲜滩。需要直譯器轉(zhuǎn)譯后才能成為機器碼。

15节值、三元運算規(guī)則以及應(yīng)用場景徙硅?

規(guī)則:為真時的結(jié)果 if 判定條件 else 為假時的結(jié)果
應(yīng)用場景:在賦值變量的時候,可以直接加判斷搞疗,然后賦值

16嗓蘑、列舉 Python2和Python3的區(qū)別?

1匿乃、默認編碼:2-->ascii桩皿,3-->utf-8
2、print的區(qū)別:python2中print是一個語句幢炸,不論想輸出什么泄隔,直接放到print關(guān)鍵字后面即可。python3里宛徊,print()是一個函數(shù)佛嬉,像其他函數(shù)一樣逻澳,print()需要你將要輸出的東西作為參數(shù)傳給它。
3暖呕、input的區(qū)別:
python2有兩個全局函數(shù)赡盘,用在命令行請求用戶輸入。第一個叫input()缰揪,它等待用戶輸入一個python表達式(然后返回結(jié)果)。
第二個叫做raw_input(),用戶輸入什么他就返回什么葱淳。python3 通過input替代了他們钝腺。
4、字符串:
python2中有兩種字符串類型:Unicode字符串和非Unicode字符串赞厕。Python3中只有一種類型:Unicode字符串艳狐。
5、xrange()
python2里皿桑,有兩種方法獲得一定范圍內(nèi)的數(shù)字:range(),返回一個列表毫目,還有xrange(),返回一個迭代器。
python3 里诲侮,range()返回迭代器镀虐,xrange()不再存在。

17沟绪、用一行代碼實現(xiàn)數(shù)值交換:

a = 1
b = 2

答案:a = 1

b = 2
a,b = b,a

18刮便、Python3和Python2中 int 和 long的區(qū)別?

python2有非浮點數(shù)準備的int和long類型绽慈。int類型最大值不能超過sys.maxint恨旱,而且這個最大值是平臺相關(guān)的“犹郏可以通過在數(shù)字的末尾附上一個L來定義長整型搜贤,顯然,它比int類型表示的數(shù)字范圍更大钝凶。在python3里仪芒,只有一種整數(shù)類型int,大多數(shù)情況下,和python2中的長整型類似耕陷。

19桌硫、xrange和range的區(qū)別?

python2里啃炸,有兩種方法獲得一定范圍內(nèi)的數(shù)字:range(),返回一個列表铆隘,還有xrange(),返回一個迭代器。
python3 里南用,range()返回迭代器膀钠,xrange()不再存在掏湾。

20、文件操作時:xreadlines和readlines的區(qū)別肿嘲?

readlines返回一個list融击,xreadlines方法返回一個生成器

21、列舉布爾值為False的常見值雳窟?

0, [] , () , {} , '' , False , None

22尊浪、字符串、列表封救、元組拇涤、字典每個常用的5個方法?

字符串: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表達式格式以及應(yīng)用場景鹅士?

表達式格式:lambda后面跟一個或多個參數(shù),緊跟一個冒號惩坑,以后是一個表達式掉盅。冒號前是參數(shù),冒號后是返回值以舒。例如:lambda x : 2x
應(yīng)用場景:經(jīng)常與一些內(nèi)置函數(shù)相結(jié)合使用趾痘,比如說map(),filter(),sorted(),reduce()等

24、pass的作用蔓钟?

1扼脐、空語句 do nothing
2、保證格式完整
3奋刽、保證語義完整

25瓦侮、arg和kwarg作用?*

萬能參數(shù)佣谐,解決了函數(shù)參數(shù)不固定的問題
*arg:會把位置參數(shù)轉(zhuǎn)化為tuple
**kwarg:會把關(guān)鍵字參數(shù)轉(zhuǎn)化為dict

26肚吏、is和==的區(qū)別?

is:判斷內(nèi)存地址是否相等
==:判斷數(shù)值是否相等

27狭魂、簡述Python的深淺拷貝以及應(yīng)用場景罚攀?

copy():淺copy,淺拷貝指僅僅拷貝數(shù)據(jù)集合的第一層數(shù)據(jù)
deepcopy():深copy,深拷貝指拷貝數(shù)據(jù)集合的所有層

28雌澄、Python垃圾回收機制斋泄?

python采用的是引用計數(shù)機制為主,標記-清除和分代收集(隔代回收镐牺、分代回收)兩種機制為輔的策略

計數(shù)機制:

Python的GC模塊主要運用了引用計數(shù)來跟蹤和回收垃圾炫掐。在引用計數(shù)的基礎(chǔ)上,還可以通過“標記-清除”

解決容器對象可能產(chǎn)生的循環(huán)引用的問題睬涧。通過分代回收以空間換取時間進一步提高垃圾回收的效率募胃。

標記-清除:

標記-清除的出現(xiàn)打破了循環(huán)引用旗唁,也就是它只關(guān)注那些可能會產(chǎn)生循環(huán)引用的對象
缺點:該機制所帶來的額外操作和需要回收的內(nèi)存塊成正比。

隔代回收:

原理:將系統(tǒng)中的所有內(nèi)存塊根據(jù)其存活時間劃分為不同的集合痹束,每一個集合就成為一個“代”检疫,
垃圾收集的頻率隨著“代”的存活時間的增大而減小。也就是說祷嘶,活得越長的對象屎媳,就越不可能是垃圾,就應(yīng)該減少對它的垃圾收集頻率论巍。那么如何來衡量這個存活時間:通常是利用幾次垃圾收集動作來衡量烛谊,如果一個對象經(jīng)過的垃圾收集次數(shù)越多,可以得出:該對象存活時間就越長环壤。

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()默認參數(shù)為可變數(shù)據(jù)類型時有坑

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]

解析: 問題的本質(zhì)在與python中的屬性查找規(guī)則,LEGB(local剪返,enclousing废累,global,bulitin)脱盲,在上面的例子中邑滨,i就是在閉包作用域(enclousing),而Python的閉包是 遲綁定 钱反,這意味著閉包中用到的變量的值掖看,是在內(nèi)部函數(shù)被調(diào)用時查詢得到的

所以:[lambda x: i*x for i in range(4)]打印出來是含有四個內(nèi)存地址的列表,每個內(nèi)存地址中的i在本內(nèi)存中都沒有被定義面哥,而是通過閉包作用域中的i值哎壳,當for循環(huán)執(zhí)行結(jié)束后,i的值等于3尚卫,所以再執(zhí)行[m(2) for m in num()]時归榕,每個內(nèi)存地址中的i值等于3,當x等于2時吱涉,打印出來的結(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)過濾函數(shù)
map(function乞旦,iterable)循環(huán)函數(shù)
reduce(function, iterable)累積函數(shù)

34贼穆、一行代碼實現(xiàn)99乘法表。*

lis = ['%s%s=%s'%(i,j,ij) for i in range(1,10) for j in range(i,10)]

35兰粉、如何安裝第三方模塊故痊?以及用過哪些第三方模塊?

pip3 imstall 模塊名 django玖姑,Matplotlib愕秫,Tornado,PyGame

36焰络、至少列舉8個常用模塊都有那些戴甩?

os,sys,time,random,re,hashlib,logging,json,pickle….

37、re的match和search區(qū)別闪彼?

match:從字符串的開頭位置匹配甜孤,必須以此為開頭
search:從開頭開始查,找到符合的就返回結(jié)果

38畏腕、什么是正則的貪婪匹配缴川?

正則表達式一般趨向于最大長度匹配

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) )===>返回一個生成器的內(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ù)的第二個默認參數(shù)是一個list流昏,當?shù)谝淮螆?zhí)行的時候?qū)嵗艘粋€list扎即,
第二次執(zhí)行還是用第一次執(zhí)行的時候?qū)嵗牡刂反鎯Γ院竺看螌嵗际?/p>

42况凉、如何實現(xiàn) "1,2,3" 變成 ['1','2','3'] ?

a = "1,2,3"li = a.split(',')

43谚鄙、如何實現(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)] 雖然列表的每個元素加上了括號闷营,但是當括號內(nèi)只有一個元素并且沒有逗號時,其數(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傻盟、一行代碼實現(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è)置一個全局變量 ?

使用python的內(nèi)置語法 globals 全局變量

48、logging模塊的作用娘赴?以及應(yīng)用場景规哲?

logging模塊的作用:
1、程序調(diào)試
2诽表、了解軟件程序運行情況唉锌,是否正常
3、軟件程序運行故障分析與問題定位
應(yīng)用場景:網(wǎng)站的運維工作竿奏,程序?qū)崟r監(jiān)控

49袄简、請用代碼簡答實現(xiàn)stack 。

def Stack(object):

def __init__(self):  
      self.stack = []

def push(self,value):
      # 進棧    
     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、簡述生成器宗雇、迭代器昂芜、可迭代對象以及應(yīng)用場景莹规?

生成器:在 Python 中赔蒲,一邊循環(huán)一邊計算的機制,稱為 生成器(generator)良漱,通過next()取值舞虱,兩種表現(xiàn)形式1、將列表生成式的[]改為()2母市、含有yield關(guān)鍵字的函數(shù)
應(yīng)用場景:優(yōu)化代碼矾兜,節(jié)省內(nèi)存
迭代器:是訪問集合元素的一種方式。迭代器同時實現(xiàn)了iternext方法 可迭代對象:只要實現(xiàn)了iter方法的對象就是可迭代對象

52患久、用Python實現(xiàn)一個二分查找的函數(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 endelse:return None
print(two_find(17, lis))

53、談?wù)勀銓﹂]包的理解蒋失?

在一個外函數(shù)中定義了一個內(nèi)函數(shù)返帕,內(nèi)函數(shù)里運用了外函數(shù)的臨時變量,并且外函數(shù)的返回值是內(nèi)函數(shù)的引用篙挽。這樣就構(gòu)成了一個閉包荆萤。
一般情況下,在我們認知當中,如果一個函數(shù)結(jié)束链韭,函數(shù)的內(nèi)部所有東西都會釋放掉偏竟,還給內(nèi)存,局部變量都會消失敞峭。
但是閉包是一種特殊情況踊谋,如果外函數(shù)在結(jié)束的時候發(fā)現(xiàn)有自己的臨時變量將來會在內(nèi)部函數(shù)中用到,就把這個臨時變量綁定給了內(nèi)部函數(shù)儡陨,然后自己再結(jié)束褪子。

54、os和sys模塊的作用骗村?

os模塊負責(zé)程序與操作系統(tǒng)的交互嫌褪,提供了訪問操作系統(tǒng)底層的接口;
sys模塊負責(zé)程序與python解釋器的交互,提供了一系列的函數(shù)和變量胚股,用于操控python的運行時環(huán)境笼痛。

55、如何生成一個隨機數(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刪除一個文件?

import os
os.remove(r'path')

57进宝、談?wù)勀銓γ嫦驅(qū)ο蟮睦斫猓?/strong>

面向?qū)ο蟮某绦蛟O(shè)計的核心是對象(上帝式思維)刻坊,要理解對象為何物,必須把自己當成上帝党晋,上帝眼里世間存在的萬物皆為對象谭胚,不存在的也可以創(chuàng)造出來。對象是特征和技能的結(jié)合未玻,其中特征和技能分別對應(yīng)對象的數(shù)據(jù)屬性和方法屬性灾而。
優(yōu)點是:解決了程序的擴展性。對某一個對象單獨修改扳剿,會立刻反映到整個體系中旁趟,如對游戲中一個人物參數(shù)的特征和技能修改都很容易。
缺點:可控性差庇绽,無法向面向過程的程序設(shè)計流水線式的可以很精準的預(yù)測問題的處理流程與結(jié)果锡搜,面向?qū)ο蟮某绦蛞坏╅_始就由對象之間的交互解決問題,即便是上帝也無法預(yù)測最終結(jié)果瞧掺。
應(yīng)用場景:需求經(jīng)常變化的軟件耕餐,一般需求的變化都集中在用戶層,互聯(lián)網(wǎng)應(yīng)用夸盟,企業(yè)內(nèi)部軟件蛾方,游戲等都是面向?qū)ο蟮某绦蛟O(shè)計大顯身手的好地方。

58、Python面向?qū)ο笾械睦^承有什么特點桩砰?

1:在繼承中基類的構(gòu)造(init()方法)不會被自動調(diào)用拓春,它需要在其派生類的構(gòu)造中親自專門調(diào)用。
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)先是什么酿联?

Python的類可以繼承多個類终息,那么其尋找類方法的方式有兩種:

當類是經(jīng)典類時(主要在python2版本中的沒有主動繼承object的類),多繼承情況下贞让,會按照深度優(yōu)先方式查找
當類是新式類時(python3版本中的所有類和python2中主動繼承object的類)周崭,多繼承情況下,會按照廣度優(yōu)先方式查找
簡單點說就是:經(jīng)典類是縱向查找喳张,新式類是橫向查找

60续镇、面向?qū)ο笾衧uper的作用?

1销部、super在面向?qū)ο罄^承類中代指父類摸航,書寫方法super(類名,self).屬性或者方法或super().屬性或者方法
2、super方法可以增加類之間調(diào)用的靈活性柴墩,當父類名發(fā)生變化時不必修改
3忙厌、super方法在類的多繼承時可以簡化代碼凫岖,避免代碼冗余
4江咳、super機制里可以保證公共父類僅被執(zhí)行一次,執(zhí)行的順序遵循MRO哥放,廣度優(yōu)先查詢方法

61歼指、是否使用過functools中的函數(shù)?其作用是什么甥雕?

functools用于高階函數(shù):指那些作用于函數(shù)或者返回其他函數(shù)的函數(shù)踩身。通常情況下,只要是
可以被當做函數(shù)調(diào)用的對象就是這個模塊的目標社露。

62挟阻、列舉面向?qū)ο笾袔щp下劃線的特殊方法,如:new、init

__new__:構(gòu)造方法附鸽,創(chuàng)建一個對象脱拼,實例化時第一個被執(zhí)行,返回一個創(chuàng)建好的對象及__init__(self)的self坷备,

只有繼承了object的類才會有這個方法

__init__:初始化方法熄浓,__init__在__new__的基礎(chǔ)上完成一些其它初始化的動作,__init__沒有返回值

63省撑、如何判斷是函數(shù)還是方法赌蔑?

函數(shù)和方法都封裝了一些獨立的功能,如果在類中定義的函數(shù)那就是方法(對象或者類名點方法名調(diào)用)竟秫,否則就是函數(shù)(函數(shù)名()直接調(diào)用)

64娃惯、靜態(tài)方法和類方法區(qū)別?

靜態(tài)方法:是既不是用類中的屬性又不使用對象中的屬性肥败,由類或者對象調(diào)用的方法石景,依賴python裝飾器@staticmethod來實現(xiàn)
類方法:只使用類中的靜態(tài)變量,一般都是由類調(diào)用拙吉,依賴python裝飾器@classmethod來實現(xiàn)

65潮孽、列舉面向?qū)ο笾械奶厥獬蓡T以及應(yīng)用場景?

__call__:對象的構(gòu)造方法筷黔,對象加上()往史,可以觸發(fā)這個類的__call__方法。
__len__:內(nèi)置函數(shù)的len函數(shù)是依賴類中的__len__方法
__eq__:判斷值是否相等的時候依賴__eq__方法
__hash__:判斷hash值是否相等的時候依賴__hash__方法(拓展:set的去重機制其實就是根據(jù)__hash__和__eq__方法實現(xiàn)的)
__str__:和str() print() %s 都是息息相關(guān)的佛舱,返回值一定是字符串類型
__repr__:和 repr() %r都是息息相關(guān)的椎例,在沒有__str__方法時,__repr__可以完全取代__str__请祖。del 析構(gòu)方法订歪,對應(yīng)著一個對象的刪除之前執(zhí)行的內(nèi)容

66、1肆捕、2刷晋、3、4慎陵、5 能組成多少個互不相同且無重復(fù)的三位數(shù)

count = 0for 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)用場景席纽?

定義:通過用字符串數(shù)據(jù)類型的變量名來訪問這個變量的值捏悬,在python面向?qū)ο笾械姆瓷?通過字符串的形式操作對象相關(guān)的屬性或方法.
應(yīng)用場景:用于處理通過用戶輸入,文件讀取润梯,或者網(wǎng)絡(luò)傳輸所得到的字符串形式的指令來完成對應(yīng)的操作

68过牙、metaclass作用甥厦?以及應(yīng)用場景?

metaclass寇钉,直譯為元類矫渔,簡單的解釋就是:當我們定義了類以后,就可以根據(jù)這個類創(chuàng)建出實例摧莽,
所以:先定義類庙洼,然后創(chuàng)建實例。但是如果我們想創(chuàng)建出類呢镊辕?那就必須根據(jù)metaclass創(chuàng)建出類油够,
所以:先定義metaclass,然后創(chuàng)建類征懈。換句話說石咬,你可以把類看成是metaclass創(chuàng)建出來的“實例”

69、用盡量多的方法實現(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)在一個py文件中寫好一個類焕窝,實例化一個對象。以后用這個類直接導(dǎo)入這個模塊就是單例模式维贺。

3它掂、基于裝飾器方法實現(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@singletonclass Person:
    pass

70、裝飾器的寫法以及應(yīng)用場景溯泣。

裝飾器的寫法:

def wrapper(func):
    def inner(*args,**kwargs):
        '被裝飾之前的操作' 
       ret = func(*args,**kwargs)
        '被裝飾之后的操作'
        return ret
    return inner

裝飾器的應(yīng)用場景:

比如注冊登錄虐秋、插入日志,性能測試垃沦,事務(wù)處理客给,緩存等等場景

71、異常處理寫法以及如何主動跑出異常(應(yīng)用場景)

異常處理的常規(guī)寫法:

    try: 
       執(zhí)行的主體函數(shù)
    except Exception as e: 
       print(str(e))

主動拋出異常:

raise TypeError('出現(xiàn)了不可思議的異常')#TypeError可以是任意的錯誤類型

72肢簿、什么是面向?qū)ο蟮膍ro

MRO(Method Resolution Order 方法解析順序)是面向?qū)ο笾杏糜诓樵冾惖亩嗬^承的繼承順序的方法靶剑,它是基于算法來實現(xiàn)的,不同的算法實現(xiàn)的MRO的順序不同

73译仗、isinstance作用以及應(yīng)用場景抬虽?

isinstance作用是來判斷一個對象是否是一個已知的類型

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]

代碼實現(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也為整型休涤,請檢查')
else:return None

75咱圆、json序列化時笛辟,可以處理的數(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序列化時胀蛮,默認遇到中文會轉(zhuǎn)換成unicode,如果想要保留中文怎么辦糯钙?

在序列化是將json.dumps中的默認參數(shù)ensure_ascii改為False就可以保留中文了
json.dumps(obj,ensure_ascii=False)

77粪狼、什么是斷言?應(yīng)用場景任岸?

assert 條件,'自定義錯誤提示(可有可無)' 例:assert 1 == 0,'這是一個低級的錯誤
合約式設(shè)計是斷言的經(jīng)典應(yīng)用再榄,在一個正確的程序里,所有的前置條件和后置條件都將得到處理享潜。

78不跟、使用代碼實現(xiàn)查看列舉目錄下的所有文件。

方法一:遞歸處理

import os
url = r'C:\Users\Mr.Wang\PycharmProjects\untitled\前段學(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:\Users\Mr.Wang\PycharmProjects\untitled\python基礎(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米碰、簡述 yield和yield from關(guān)鍵字窝革。

yield 是一個類似 return 的關(guān)鍵字,只是這個函數(shù)返回的是個生成器當你調(diào)用這個函數(shù)的時候吕座,函數(shù)內(nèi)部的代碼并不立馬執(zhí)行 虐译,這個函數(shù)只是返回一個生成器對象,當你使用for進行迭代的時候吴趴,函數(shù)中的代碼才會執(zhí)行

yield from 的主要功能是打開雙向通道漆诽,把最外層的調(diào)用方與最內(nèi)層的子生成器連接起來,這樣二者可以直接發(fā)送和產(chǎn)出值锣枝,還可以直接傳入異常厢拭,而不用在位于中間的協(xié)程中添加大量處理異常的樣板代碼。
有了這個結(jié)構(gòu)撇叁,協(xié)程可以通過以前不可能的方式委托職責(zé)供鸠。

80、代碼實現(xià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陨闹、代碼實現(xiàn)隨機發(fā)紅包功能

import randomdef 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楞捂、請盡可能列舉python列表的成員方法薄坏,并給出列表操作的答案:

(1) a=[1, 2, 3, 4, 5], a[::2]=? a[-2:]=寨闹?
a[::2]=[1,3,5],
a[-2:] = [4,5]

(2)一行代碼實現(xiàn)對列表a中的偶數(shù)位置的元素進行加3后求和胶坠?
` sum([i+3 for i in a[::2]])

(3)將列表a的元素順序打亂,再對a進行排序得到列表b繁堡,然后把a和b按元素順序構(gòu)造一個字典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言所寫的程序在運行時椭蹄,就能知道對象的類型矮瘟。也就是程序運行時能夠獲得對象的類型。比如type()塑娇,dir()澈侠,getattr(),hasattr()埋酬,isinstance()哨啃。

84、Python是如何進行內(nèi)存管理的写妥?

從三個方面來說,一對象的引用計數(shù)機制,二垃圾回收機制,三內(nèi)存池機制

(1)拳球、對象的引用計數(shù)機制

Python內(nèi)部使用引用計數(shù),來保持追蹤內(nèi)存中的對象珍特,所有對象都有引用計數(shù)祝峻。
引用計數(shù)增加的情況:
1,一個對象分配一個新名稱
2扎筒,將其放入一個容器中(如列表莱找、元組或字典)
引用計數(shù)減少的情況:
1,使用del語句對對象別名顯示的銷毀
2嗜桌,引用超出作用域或被重新賦值
sys.getrefcount( )函數(shù)可以獲得對象的當前引用計數(shù)
多數(shù)情況下奥溺,引用計數(shù)比你猜測得要大得多。對于不可變數(shù)據(jù)(如數(shù)字和字符串)骨宠,解釋器會在程序的不同部分共享內(nèi)存浮定,以便節(jié)約內(nèi)存。

(2)层亿、垃圾回收

1桦卒,當一個對象的引用計數(shù)歸零時,它將被垃圾收集機制處理掉匿又。
2方灾,當兩個對象a和b相互引用時,del語句可以減少a和b的引用計數(shù)琳省,并銷毀用于引用底層對象的名稱迎吵。然而由于每個對象都包含一個對其他對象的應(yīng)用躲撰,因此引用計數(shù)不會歸零针贬,對象也不會銷毀击费。(從而導(dǎo)致內(nèi)存泄露)。為解決這一問題桦他,解釋器會定期執(zhí)行一個循環(huán)檢測器蔫巩,搜索不可訪問對象的循環(huán)并刪除它們。

(3)快压、內(nèi)存池機制

Python提供了對內(nèi)存的垃圾收集機制圆仔,但是它將不用的內(nèi)存放到內(nèi)存池而不是返回給操作系統(tǒng)。
1蔫劣,Pymalloc機制坪郭。為了加速Python的執(zhí)行效率,Python引入了一個內(nèi)存池機制脉幢,用于管理對小塊內(nèi)存的申請和釋放歪沃。
2,Python中所有小于256個字節(jié)的對象都使用pymalloc實現(xiàn)的分配器嫌松,而大的對象則使用系統(tǒng)的malloc沪曙。
3,對于Python對象萎羔,如整數(shù)液走,浮點數(shù)和List,都有其獨立的私有內(nèi)存池贾陷,對象間不共享他們的內(nèi)存池缘眶。也就是說如果你分配又釋放了大量的整數(shù),用于緩存這些整數(shù)的內(nèi)存就不能再分配給浮點數(shù)髓废。

85磅崭、介紹一下except的用法和作用?

try…except…except…else…
-- 執(zhí)行try下的語句瓦哎,如果引發(fā)異常砸喻,則執(zhí)行過程會跳到except語句。對每個except分支順序嘗試執(zhí)行蒋譬,如果引發(fā)的異常與except中的異常組匹配割岛,執(zhí)行相應(yīng)的語句。如果所有的except都不匹配犯助,則異常會傳遞到下一個調(diào)用本代碼的最高層try代碼中癣漆。
-- try下的語句正常執(zhí)行,則執(zhí)行else塊代碼剂买。如果發(fā)生異常惠爽,就不會執(zhí)行
-- 如果存在finally語句癌蓖,最后總是會執(zhí)行。

86婚肆、如何用Python來進行查詢和替換一個文本字符串租副?

可以使用re模塊中的sub()函數(shù)或者subn()函數(shù)來進行查詢和替換,比replace的功能更強大=闲浴S蒙!
格式:sub(replacement, string[,count=0])(replacement是被替換成的文本赞咙,string是需要被替換的文本责循,count是一個可選參數(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()一樣攀操,不過它會返回一個二維數(shù)組院仿,包括替換后的新的字符串和總共替換的數(shù)量

87、有沒有一個工具可以幫助查找python的bug和進行靜態(tài)的代碼分析速和?

PyChecker是一個python代碼的靜態(tài)分析工具歹垫,它可以幫助查找python代碼的bug, 會對代碼的復(fù)雜度和格式提出警告。
Pylint是另外一個工具可以進行codingstandard檢查健芭。


來源:segmentfault 作者:農(nóng)夫
網(wǎng)址:https://segmentfault.com/a/1190000017349906

image

?資源分享:

關(guān)注微信《python江湖》回復(fù)“1”領(lǐng)取python學(xué)習(xí)70本電子書+200G視頻學(xué)習(xí)資源

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末县钥,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子慈迈,更是在濱河造成了極大的恐慌若贮,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件痒留,死亡現(xiàn)場離奇詭異谴麦,居然都是意外死亡,警方通過查閱死者的電腦和手機伸头,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門匾效,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人恤磷,你說我怎么就攤上這事面哼。” “怎么了扫步?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵魔策,是天一觀的道長。 經(jīng)常有香客問我河胎,道長闯袒,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮政敢,結(jié)果婚禮上其徙,老公的妹妹穿的比我還像新娘。我一直安慰自己喷户,他們只是感情好唾那,可當我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著摩骨,像睡著了一般通贞。 火紅的嫁衣襯著肌膚如雪朗若。 梳的紋絲不亂的頭發(fā)上恼五,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天,我揣著相機與錄音哭懈,去河邊找鬼灾馒。 笑死,一個胖子當著我的面吹牛遣总,可吹牛的內(nèi)容都是我干的睬罗。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼旭斥,長吁一口氣:“原來是場噩夢啊……” “哼容达!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起垂券,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤花盐,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后菇爪,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體算芯,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年凳宙,在試婚紗的時候發(fā)現(xiàn)自己被綠了熙揍。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡氏涩,死狀恐怖届囚,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情是尖,我是刑警寧澤意系,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站析砸,受9級特大地震影響昔字,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一作郭、第九天 我趴在偏房一處隱蔽的房頂上張望陨囊。 院中可真熱鬧,春花似錦夹攒、人聲如沸蜘醋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽压语。三九已至,卻和暖如春编检,著一層夾襖步出監(jiān)牢的瞬間胎食,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工允懂, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留厕怜,地道東北人。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓蕾总,卻偏偏與公主長得像粥航,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子生百,可洞房花燭夜當晚...
    茶點故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內(nèi)容