Python 常用面試題

HuangZhang_123發表於2017-11-02

python:3.5
歡迎加入學習交流QQ群:657341423


1.可變型別 Vs 不可變型別
可變型別(mutable):列表,字典,集合
不可變型別(unmutable):數字,字串,元組
這裡的可變不可變,是指記憶體中的那塊內容(value)是否可以被改變
參考資料:http://www.cnblogs.com/huamingao/p/5809936.html


2.併發程式設計——全域性解釋鎖(GIL)
Python作為一種解釋型語言,由於使用了全域性解釋鎖(GIL)的原因,其程式碼不能同時在多核CPU上併發的執行。這也導致在Python中使用多執行緒程式設計並不能實現併發,我們得使用其他的方法在Python中實現併發程式設計。

Python並不支援真正意義上的多執行緒。Python中提供了多執行緒包,但是如果你想通過多執行緒提高程式碼的速度,使用多執行緒包並不是個好主意。Python中有一個被稱為Global Interpreter Lock(GIL)的東西,它會確保任何時候你的多個執行緒中,只有一個被執行。執行緒的執行速度非常之快,會讓你誤以為執行緒是並行執行的,但是實際上都是輪流執行。經過GIL這一道關卡處理,會增加執行的開銷。這意味著,如果你想提高程式碼的執行速度,使用threading包並不是一個很好的方法。
參考資料:
http://www.cnblogs.com/vipchenwei/p/7221851.html?utm_source=itdadao&utm_medium=referral


3.資料結構和演算法
不管任何開發語言,資料結構和演算法都是必須具備的,不然只能算是個碼農,算不上真正的程式設計師。
參考資料:http://www.cnblogs.com/hanahimi/p/4692225.html


4.@staticmethod和@classmethod和@property
@classmethod, @staticmethod和@property這三個裝飾器的使用物件是在類中定義的函式
參考資料:
http://blog.csdn.net/u010571844/article/details/50728991
http://www.cnblogs.com/wangyongsong/p/6750454.html


5.類變數和例項變數
參考資料:http://www.cnblogs.com/sherylwang/p/5537778.html


**6.這兩個引數是什麼意思:args,kwargs
如果我們不確定要往函式中傳入多少個引數,或者我們想往函式中以列表和元組的形式傳引數時,那就使要用
args;如果我們不知道要往函式中傳入多少個關鍵詞引數,或者想傳入字典的值作為關鍵詞引數時,那就要使用**kwargs。args和kwargs這兩個識別符號是約定俗成的用法,你當然還可以用*bob和**billy,但是這樣就並不太妥。

下面是具體的示例:

def f(*args,**kwargs): print args, kwargs

l = [1,2,3]
t = (4,5,6)
d = {'a':7,'b':8,'c':9}

f()
f(1,2,3)                    # (1, 2, 3) {}
f(1,2,3,"groovy")           # (1, 2, 3, 'groovy') {}
f(a=1,b=2,c=3)              # () {'a': 1, 'c': 3, 'b': 2}
f(a=1,b=2,c=3,zzz="hi")     # () {'a': 1, 'c': 3, 'b': 2, 'zzz': 'hi'}
f(1,2,3,a=1,b=2,c=3)        # (1, 2, 3) {'a': 1, 'c': 3, 'b': 2}

f(*l,**d)                   # (1, 2, 3) {'a': 7, 'c': 9, 'b': 8}
f(*t,**d)                   # (4, 5, 6) {'a': 7, 'c': 9, 'b': 8}
f(1,2,*t)                   # (1, 2, 4, 5, 6) {}
f(q="winning",**d)          # () {'a': 7, 'q': 'winning', 'c': 9, 'b': 8}
f(1,2,*t,q="winning",**d)   # (1, 2, 4, 5, 6) {'a': 7, 'q': 'winning', 'c': 9, 'b': 8}

def f2(arg1,arg2,*args,**kwargs): print arg1,arg2, args, kwargs

f2(1,2,3)                       # 1 2 (3,) {}
f2(1,2,3,"groovy")              # 1 2 (3, 'groovy') {}
f2(arg1=1,arg2=2,c=3)           # 1 2 () {'c': 3}
f2(arg1=1,arg2=2,c=3,zzz="hi")  # 1 2 () {'c': 3, 'zzz': 'hi'}
f2(1,2,3,a=1,b=2,c=3)           # 1 2 (3,) {'a': 1, 'c': 3, 'b': 2}

f2(*l,**d)                   # 1 2 (3,) {'a': 7, 'c': 9, 'b': 8}
f2(*t,**d)                   # 4 5 (6,) {'a': 7, 'c': 9, 'b': 8}
f2(1,2,*t)                   # 1 2 (4, 5, 6) {}
f2(1,1,q="winning",**d)      # 1 1 () {'a': 7, 'q': 'winning', 'c': 9, 'b': 8}
f2(1,2,*t,q="winning",**d)   # 1 2 (4, 5, 6) {'a': 7, 'q': 'winning', 'c': 9, 'b': 8}

7.Python垃圾回收機制
參考資料:http://www.jb51.net/article/79306.htm


8.如何寫出高效的程式碼
可以使用import cProfile 程式分析包分析程式執行時間
參考資料:http://blog.csdn.net/asukasmallriver/article/details/74356771
http://blog.csdn.net/xiemanr/article/details/72763234


9.PEP8規範
參考資料:http://blog.sae.sina.com.cn/archives/4781
Python之禪
參考資料:http://blog.csdn.net/zhoudaxia/article/details/23605263


WSGI
參考資料:http://blog.csdn.net/li_101357/article/details/52748686
參考資料:
http://python.jobbole.com/88653/

相關文章