概念題:
- 描述對(duì)super,pass,yield,lambda關(guān)鍵字的理解
- pass是空語句,是為了保持程序結(jié)構(gòu)的完整性.pass不做任何事情,一般用做占位語句
- super:在類的繼承中,如果子類重新定義了某個(gè)方法,該方法會(huì)覆蓋父類的同名方法,但有時(shí)我們需要實(shí)現(xiàn)父類的功能,為了避免代碼重用.直接調(diào)用父類的方法,我們可以通過super來實(shí)現(xiàn).
- yield:不同于return,yield返回的是一個(gè)生成器
當(dāng)函數(shù)產(chǎn)生大量僅被讀取一次的數(shù)據(jù),應(yīng)用生成器十分有效
當(dāng)你調(diào)用生成器的時(shí)候,函數(shù)中你書寫的代碼并沒有執(zhí)行,這個(gè)函數(shù)僅返回一個(gè)生成器對(duì)象。
for 循環(huán)時(shí)候都會(huì)執(zhí)行你的代碼
*lambda:其用于創(chuàng)建匿名函數(shù).主要用于需要一個(gè)函數(shù),但沒必要費(fèi)神去命名一個(gè)函數(shù)(單獨(dú)命名往往會(huì)污染命名空間)的場合下
- 請(qǐng)大致描述python GIL機(jī)制
首先明確一點(diǎn)GIL不是Python的特性,它是實(shí)現(xiàn)Python解釋器(CPython)中引入的一個(gè)概念.在Cpython中,GIL是一個(gè)互斥鎖,他用來阻止多個(gè)線程同時(shí)操作一個(gè)數(shù)據(jù).進(jìn)而保證數(shù)據(jù)安全.
另外GIL是解釋器級(jí)別的鎖,為保證Python解釋器同一時(shí)間只執(zhí)行一個(gè)任務(wù)的代碼. - python中多線程,多進(jìn)程,協(xié)程的理解
進(jìn)程是一個(gè)具有獨(dú)立功能的程序關(guān)于某個(gè)數(shù)據(jù)集合的一次運(yùn)行活動(dòng)。它可以申請(qǐng)和擁有系統(tǒng)資源,是一個(gè)動(dòng)態(tài)的概念,是一個(gè)活動(dòng)的實(shí)體。
它不只是程序的代碼,還包括當(dāng)前的活動(dòng),通過程序計(jì)數(shù)器的值和處理寄存器的內(nèi)容來表示。線程,有時(shí)被稱為輕量級(jí)進(jìn)程(Lightweight Process,LWP),是程序執(zhí)行流的最小單元。一個(gè)標(biāo)準(zhǔn)的線程由線程ID,當(dāng)前指令指針(PC),寄存器集合和堆棧組 成。
另外,線程是進(jìn)程中的一個(gè)實(shí)體,是被系統(tǒng)獨(dú)立調(diào)度和分派的基本單位,線程自己不擁有系統(tǒng)資源,只擁有一點(diǎn)兒在運(yùn)行中必不可少的資源,但它可與同屬一個(gè) 進(jìn)程的其它線程共享進(jìn)程所擁有的全部資源協(xié)程是一種用戶態(tài)的輕量級(jí)線程,即協(xié)程是由用戶程序自己控制調(diào)度的。
-
python是如何進(jìn)行內(nèi)存管理的,以及大致描述下python的GC機(jī)制
image.png 請(qǐng)分別描述一下類裝飾器和函數(shù)裝飾器的實(shí)現(xiàn)過程及應(yīng)用場景
詳細(xì)描述一下yield
一個(gè)帶有 yield 的函數(shù)就是一個(gè) generator,它和普通函數(shù)不同,生成一個(gè) generator 看起來像函數(shù)調(diào)用,但不會(huì)執(zhí)行任何函數(shù)代碼,直到對(duì)其調(diào)用 next()(在 for 循環(huán)中會(huì)自動(dòng)調(diào)用 next())才開始執(zhí)行。雖然執(zhí)行流程仍按函數(shù)的流程執(zhí)行,但每執(zhí)行到一個(gè) yield 語句就會(huì)中斷,并返回一個(gè)迭代值,下次執(zhí)行時(shí)從 yield 的下一個(gè)語句繼續(xù)執(zhí)行??雌饋砭秃孟褚粋€(gè)函數(shù)在正常執(zhí)行的過程中被 yield 中斷了數(shù)次,每次中斷都會(huì)通過 yield 返回當(dāng)前的迭代值。
yield 的好處是顯而易見的,把一個(gè)函數(shù)改寫為一個(gè) generator 就獲得了迭代能力,比起用類的實(shí)例保存狀態(tài)來計(jì)算下一個(gè) next() 的值,不僅代碼簡潔,而且執(zhí)行流程異常清晰。
詳情
socket 簡單實(shí)現(xiàn)服務(wù)端
from socket import *
from multiprocessing import Process
server = socket(AF_INET, SOCK_STREAM)
server.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
server.bind(('127.0.0.1', 8080))
server.listen(5)
def talk(conn, client_addr):
while 1:
try:
msg = conn.recv(1024)
if not msg: break
conn.send(msg.upper())
except Exception:
break
if __name__ == '__main__':
while True:
conn, client_address = server.accept()
print('已連接')
p = Process(target=talk, args=(conn, client_address))
p.start()
