簡單面試題整理

概念題:

  1. 描述對(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ì)污染命名空間)的場合下
  1. 請(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ù)的代碼.
  2. 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)度的。

  1. python是如何進(jìn)行內(nèi)存管理的,以及大致描述下python的GC機(jī)制


    image.png
  2. 請(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()

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容