第1題: python下
多線程
的限制以及
多進(jìn)程
中傳遞參數(shù)的方式?
python多線程有個(gè)全局解釋器鎖(global interpreter lock),簡(jiǎn)稱GIL,這個(gè)GIL并不是python的特性,他是只在Cpython解釋器里引入的一個(gè)概念,而在其他的語(yǔ)言編寫的解釋器里就沒(méi)有這個(gè)GIL例如:Jython。
這個(gè)鎖的意思是任一時(shí)間只能有一個(gè)線程運(yùn)用解釋器,跟單cpu跑多個(gè)程序一個(gè)意思,我們都是輪著用的,這叫“并發(fā)”,不是“并行”。
為什么會(huì)有GIL?
多核CPU的出現(xiàn),充分利用多核,采用多線程編程慢慢普及,難點(diǎn)就是線程之間數(shù)據(jù)的一致性和狀態(tài)同步
說(shuō)到GIL解釋器鎖,我們?nèi)菀紫氲皆诙嗑€程中共享全局變量的時(shí)候會(huì)有線程對(duì)全局變量進(jìn)行的資源競(jìng)爭(zhēng),會(huì)對(duì)全局變量的修改產(chǎn)生不是我們想要的結(jié)果,而那個(gè)時(shí)候我們用到的是python中線程模塊里面的互斥鎖,哪樣的話每次對(duì)全局變量進(jìn)行操作的時(shí)候,只有一個(gè)線程能夠拿到這個(gè)全局變量;看下面的代碼:
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()
接下來(lái)加入互斥鎖
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()
哪些情況適合用多線程呢:
只要在進(jìn)行耗時(shí)的IO操作的時(shí)候,能釋放GIL,所以只要在IO密集型的代碼里,用多線程就很合適
哪些情況適合用多進(jìn)程呢:
用于計(jì)算密集型,比如計(jì)算某一個(gè)文件夾的大小
多進(jìn)程間同享數(shù)據(jù)
多進(jìn)程間同享數(shù)據(jù),能夠運(yùn)用multiprocession.Value和multiprocessing.Array
第2題:解釋一下python的and-or語(yǔ)法
bool and a or b
相當(dāng)于bool? a: b
>>> a = "first"
>>> b = "second"
>>> 1 and a or b # 輸出內(nèi)容為 'first'
>>> 0 and a or b # 輸出內(nèi)容為 'second'
上述內(nèi)容你應(yīng)該可以理解,但是還存在一個(gè)問(wèn)題,請(qǐng)看下面的代碼
>>> a = ""
>>> b = "second"
>>> 1 and a or b # 輸出內(nèi)容為 'second'
因?yàn)?a 是一個(gè)空串,空串在一個(gè)布爾環(huán)境中被Python看成假值,這個(gè)表達(dá)式將“失敗”,且返回 b 的值。
如果你不將它想象成象 bool ? a : b 一樣的語(yǔ)法,而把它看成純粹的布爾邏輯,這樣的話就會(huì)得到正確的理解。
1 是真,a 是假,所以 1 and a 是假。假 or b 是b。
應(yīng)該將 and-or 技巧封裝成一個(gè)函數(shù):
def choose(bool, a, b):
return (bool and [a] or [b])[0]
因?yàn)?[a] 是一個(gè)非空列表,它永遠(yuǎn)不會(huì)為假。甚至 a 是 0 或 ” 或其它假值,列表[a]為真,因?yàn)樗幸粋€(gè)元素。
第3題: 請(qǐng)至少列舉5個(gè) PEP8 規(guī)范?
PEP8 規(guī)范 官方文檔:https://www.python.org/dev/peps/pep-0008/
PEP8中文翻譯:http://www.cnblogs.com/ajianbeyourself/p/4377933.html
這個(gè)在于平時(shí)的積累的了
- 縮進(jìn)。4個(gè)空格的縮進(jìn)(編輯器都可以完成此功能),不使用Tap,更不能混合使用Tap和空格。
- 每行最大長(zhǎng)度79,換行可以使用反斜杠,最好使用圓括號(hào)。換行點(diǎn)要在操作符的后邊敲回車。
- 類和top-level函數(shù)定義之間空兩行;類中的方法定義之間空一行;函數(shù)內(nèi)邏輯無(wú)關(guān)段落之間空一行;其他地方盡量不要再空行。
- 塊注釋,在一段代碼前增加的注釋。在‘#’后加一空格。段落之間以只有‘#’的行間隔
- 各種右括號(hào)前不要加空格。
- 逗號(hào)、冒號(hào)、分號(hào)前不要加空格。
- 函數(shù)的左括號(hào)前不要加空格。
- 序列的左括號(hào)前不要加空格。
- 操作符左右各加一個(gè)空格,不要為了對(duì)齊增加空格。
- 函數(shù)默認(rèn)參數(shù)使用的賦值符左右省略空格。
-
不要將多句語(yǔ)句寫在同一行,盡管使用‘;’允許。
i- f/for/while語(yǔ)句中,即使執(zhí)行語(yǔ)句只有一句,也必須另起一行。 - 類的方法第一個(gè)參數(shù)必須是self,而靜態(tài)方法第一個(gè)參數(shù)必須是cls。
第4題: HTTPS和HTTP的區(qū)別:
- https協(xié)議要申請(qǐng)證書到ca,需要一定經(jīng)濟(jì)成本
- http是明文傳輸,https是加密的安全傳輸
- 連接的端口不一樣,http是80,https是443
- http連接很簡(jiǎn)單,沒(méi)有狀態(tài);https是ssl加密的傳輸,身份認(rèn)證的網(wǎng)絡(luò)協(xié)議,相對(duì)http傳輸比較安全。
還有很多,自己去整理一下吧
第5題:簡(jiǎn)述Django的orm
ORM,全拼Object-Relation Mapping,意為對(duì)象-關(guān)系映射
實(shí)現(xiàn)了數(shù)據(jù)模型與數(shù)據(jù)庫(kù)的解耦,通過(guò)簡(jiǎn)單的配置就可以輕松更換數(shù)據(jù)庫(kù),而不需要修改代碼只需要面向?qū)ο缶幊?
ORM操作本質(zhì)上會(huì)根據(jù)對(duì)接的數(shù)據(jù)庫(kù)引擎,翻譯成對(duì)應(yīng)的sql語(yǔ)句,
所有使用Django開發(fā)的項(xiàng)目無(wú)需關(guān)心程序底層使用的是MySql、Oracle、SQLite....,如果數(shù)據(jù)庫(kù)遷移,只需要更換Django的數(shù)據(jù)庫(kù)引擎即可。
第6題:關(guān)注題,最近在公號(hào)更新一個(gè)神奇的系列入門文章
她專科學(xué)歷
27歲從零開始學(xué)習(xí)c,c++,python編程語(yǔ)言
29歲編寫百例教程
30歲掌握10種編程語(yǔ)言,
用自學(xué)的經(jīng)歷告訴你,學(xué)編程就找夢(mèng)想橡皮擦
歡迎關(guān)注她的公眾號(hào),搜索— 非本科程序員
序號(hào) | 文章 |
---|---|
Python面試題No1 | Python基礎(chǔ)面試,看這篇文章畫重點(diǎn)吧 |
Python面試題No2 | Python面試快問(wèn)快答,理論要的就是速度與精準(zhǔn) |
Python面試題No3 | 學(xué)習(xí)Python一年,基礎(chǔ)忘記了,看看面試題回憶回議 |
Python面試題No4 | 去面試Python工程師,這幾個(gè)基礎(chǔ)問(wèn)題一定要能回答 |
Python面試題No5 | 2019年,Python工程師必考的6個(gè)面試題 |
Python面試題No6 | 昨天去面試,這5個(gè)Python面試題都被考到了 |
Python面試題No7 | 周三面試Python開發(fā),這幾道Python面試題差點(diǎn)答錯(cuò),Python面試題No7 |
Python面試題No8 | 面試Python工程師,這幾道編碼題有必要背背 |
Python面試題No9 | 又面試了Python爬蟲工程師,碰到這么幾道面試題 |
Python面試題No10 | 朋友去面試Python工程師,又帶回來(lái)幾道基礎(chǔ)題 |
Python面試題No11 | 剛畢業(yè)去面試Python工程師,這幾道題太難了 |
Python面試題No12 | 五一4天就背這些Python面試題了 |
Python面試題No13 | 大意了,這幾道Python面試題沒(méi)有答對(duì) |
Python面試題No14 | 明天找python工作,看看這幾道Python面試題吧 |
Python面試題No15 | 這幾道Python面試題,穩(wěn)準(zhǔn)狠 |
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
