第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()
接下來加入互斥鎖
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()
哪些情況適合用多線程呢:
只要在進行耗時的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'
上述內容你應該可以理解,但是還存在一個問題,請看下面的代碼
>>> a = ""
>>> b = "second"
>>> 1 and a or b # 輸出內容爲 'second'
因爲 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]
因爲 [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面試題No1 | Python基礎面試,看這篇文章畫重點吧 |
Python面試題No2 | Python面試快問快答,理論要的就是速度與精準 |
Python面試題No3 | 學習Python一年,基礎忘記了,看看面試題回憶回議 |
Python面試題No4 | 去面試Python工程師,這幾個基礎問題一定要能回答 |
Python面試題No5 | 2019年,Python工程師必考的6個面試題 |
Python面試題No6 | 昨天去面試,這5個Python面試題都被考到了 |
Python面試題No7 | 週三面試Python開發,這幾道Python面試題差點答錯,Python面試題No7 |
Python面試題No8 | 面試Python工程師,這幾道編碼題有必要背背 |
Python面試題No9 | 又面試了Python爬蟲工程師,碰到這麼幾道面試題 |
Python面試題No10 | 朋友去面試Python工程師,又帶回來幾道基礎題 |
Python面試題No11 | 剛畢業去面試Python工程師,這幾道題太難了 |
Python面試題No12 | 五一4天就背這些Python面試題了 |
Python面試題No13 | 大意了,這幾道Python面試題沒有答對 |
Python面試題No14 | 明天找python工作,看看這幾道Python面試題吧 |
Python面試題No15 | 這幾道Python面試題,穩準狠 |