千萬不要錯過這幾道Python面試題,Python面試題No16
第1題: python下多線程的限制以及多進程中傳遞參數的方式?
python多線程有個全局解釋器鎖(global interpreter lock),簡稱GIL,這個GIL并不是python的特性,他是只在Cpython解釋器里引入的一個概念,而在其他的語言編寫的解釋器里就沒有這個GIL例如:Jython。
這個鎖的意思是任一時間只能有一個線程運用解釋器,跟單cpu跑多個程序一個意思,我們都是輪著用的,這叫“并發”,不是“并行”。
為什么會有GIL?
多核CPU的出現,充分利用多核,采用多線程編程慢慢普及,難點就是線程之間數據的一致性和狀態同步
說到GIL解釋器鎖,我們容易想到在多線程中共享全局變量的時候會有線程對全局變量進行的資源競爭,會對全局變量的修改產生不是我們想要的結果,而那個時候我們用到的是python中線程模塊里面的互斥鎖,哪樣的話每次對全局變量進行操作的時候,只有一個線程能夠拿到這個全局變量;看下面的代碼:
import threading global_num = 0 def test1(): global global_num for i in range(1000000): global_num += 1 print("test1", global_num) def test2(): global global_num for i in range(1000000): global_num += 1 print("test2", global_num) t1 = threading.Thread(target=test1) t2 = threading.Thread(target=test2) t1.start() t2.start()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
接下來加入互斥鎖
import threading import time global_num = 0 lock = threading.Lock() def test1(): global global_num lock.acquire() for i in range(1000000): global_num += 1 lock.release() print("test1", global_num) def test2(): global global_num lock.acquire() for i in range(1000000): global_num += 1 lock.release() print("test2", global_num) t1 = threading.Thread(target=test1) t2 = threading.Thread(target=test2) start_time = time.time() t1.start() t2.start()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
哪些情況適合用多線程呢:
只要在進行耗時的IO操作的時候,能釋放GIL,所以只要在IO密集型的代碼里,用多線程就很合適
哪些情況適合用多進程呢:
用于計算密集型,比如計算某一個文件夾的大小
多進程間同享數據
多進程間同享數據,能夠運用multiprocession.Value和multiprocessing.Array
第2題:解釋一下python的and-or語法
bool and a or b
相當于bool? a: b
>>> a = "first" >>> b = "second" >>> 1 and a or b # 輸出內容為 'first' >>> 0 and a or b # 輸出內容為 'second'
1
2
3
4
上述內容你應該可以理解,但是還存在一個問題,請看下面的代碼
>>> a = "" >>> b = "second" >>> 1 and a or b # 輸出內容為 'second'
1
2
3
4
因為 a 是一個空串,空串在一個布爾環境中被Python看成假值,這個表達式將“失敗”,且返回 b 的值。
如果你不將它想象成象 bool ? a : b 一樣的語法,而把它看成純粹的布爾邏輯,這樣的話就會得到正確的理解。
1 是真,a 是假,所以 1 and a 是假。假 or b 是b。
應該將 and-or 技巧封裝成一個函數:
def choose(bool, a, b): return (bool and [a] or [b])[0]
1
2
因為 [a] 是一個非空列表,它永遠不會為假。甚至 a 是 0 或 ” 或其它假值,列表[a]為真,因為它有一個元素。
第3題: 請至少列舉5個 PEP8 規范?
PEP8 規范 官方文檔:https://www.python.org/dev/peps/pep-0008/
PEP8中文翻譯:http://www.cnblogs.com/ajianbeyourself/p/4377933.html
這個在于平時的積累的了
縮進。4個空格的縮進(編輯器都可以完成此功能),不使用Tap,更不能混合使用Tap和空格。
每行最大長度79,換行可以使用反斜杠,最好使用圓括號。換行點要在操作符的后邊敲回車。
類和top-level函數定義之間空兩行;類中的方法定義之間空一行;函數內邏輯無關段落之間空一行;其他地方盡量不要再空行。
塊注釋,在一段代碼前增加的注釋。在‘#’后加一空格。段落之間以只有‘#’的行間隔
各種右括號前不要加空格。
逗號、冒號、分號前不要加空格。
函數的左括號前不要加空格。
序列的左括號前不要加空格。
操作符左右各加一個空格,不要為了對齊增加空格。
函數默認參數使用的賦值符左右省略空格。
不要將多句語句寫在同一行,盡管使用‘;’允許。
i- f/for/while語句中,即使執行語句只有一句,也必須另起一行。
類的方法第一個參數必須是self,而靜態方法第一個參數必須是cls。
第4題: HTTPS和HTTP的區別:
https協議要申請證書到ca,需要一定經濟成本
http是明文傳輸,https是加密的安全傳輸
連接的端口不一樣,http是80,https是443
http連接很簡單,沒有狀態;https是ssl加密的傳輸,身份認證的網絡協議,相對http傳輸比較安全。
還有很多,自己去整理一下吧
第5題:簡述Django的orm
ORM,全拼Object-Relation Mapping,意為對象-關系映射
實現了數據模型與數據庫的解耦,通過簡單的配置就可以輕松更換數據庫,而不需要修改代碼只需要面向對象編程
ORM操作本質上會根據對接的數據庫引擎,翻譯成對應的sql語句,
所有使用Django開發的項目無需關心程序底層使用的是MySql、Oracle、SQLite…,如果數據庫遷移,只需要更換Django的數據庫引擎即可。
第6題:關注題,最近在公號更新一個神奇的系列入門文章
她專科學歷
27歲從零開始學習c,c++,python編程語言
29歲編寫百例教程
30歲掌握10種編程語言,
用自學的經歷告訴你,學編程就找夢想橡皮擦
Python 數據庫
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。