Python后端的面試題目

  1. *args, **kwargs 是什么意思?

args: 可變位置參數(shù)。 *kwargs: 可變關(guān)鍵字參數(shù)。

  1. 談一談 Python 中的裝飾器

Python中的裝飾器其實(shí)也是一種函數(shù), 它可以在不修改原函數(shù)代碼情況下擴(kuò)展原函數(shù)功能。裝飾器函數(shù)與普通函數(shù)不同之處就在于裝飾器函數(shù)返回了一個(gè)函數(shù)對(duì)象,裝飾器利用了閉包的原理來(lái)實(shí)現(xiàn)。主要用于日志插入,權(quán)限管理等等。

  1. Python 的垃圾回收機(jī)制以及內(nèi)存管理

垃圾回收機(jī)制: Python的垃圾回收機(jī)制以引用計(jì)數(shù)為主, 標(biāo)記清除、分代回收為輔。
引用計(jì)數(shù)指:Python在內(nèi)部維護(hù)了針對(duì)每一個(gè)對(duì)象的引用計(jì)數(shù), 當(dāng)一個(gè)對(duì)象創(chuàng)建或者被引用時(shí),其引用計(jì)數(shù)將加1,當(dāng)一個(gè)對(duì)象被銷毀或作用域失效時(shí), 其引用計(jì)數(shù)將減1。只有對(duì)象的引用計(jì)數(shù)為0時(shí),這個(gè)對(duì)象將會(huì)被回收。
引用計(jì)數(shù)的優(yōu)點(diǎn):簡(jiǎn)單、具有實(shí)時(shí)性。
缺點(diǎn):對(duì)象循環(huán)引用時(shí)將永遠(yuǎn)不會(huì)被銷毀。對(duì)于對(duì)象循環(huán)引用的狀況Python使用標(biāo)記清除來(lái)解決,Python在內(nèi)部實(shí)現(xiàn)了一個(gè)循環(huán)檢測(cè)器, 不停的檢測(cè)對(duì)象是否存在循環(huán)引用,如果兩個(gè)對(duì)象互相循環(huán)引用并且不包含其他第三者對(duì)象時(shí), 其將會(huì)被收回。在Python參考手冊(cè)中有寫(xiě)道: 當(dāng)一個(gè)對(duì)象無(wú)法獲取時(shí), 那么這個(gè)對(duì)象有可能被當(dāng)成垃圾銷毀了。Python將所有對(duì)象分成了三代, 對(duì)象存活時(shí)間越長(zhǎng)就越晚被回收, 反之則越早被回收。
內(nèi)存管理: Python使用了內(nèi)存池機(jī)制來(lái)管理內(nèi)存,其內(nèi)存以金字塔的形式對(duì)內(nèi)存功能進(jìn)行劃分,-1、-2層主要用于對(duì)操作系統(tǒng)進(jìn)行操作, 0層中是C的malloc,、free等等內(nèi)存分配和釋放函數(shù)。1、2層是一個(gè)內(nèi)存池, 當(dāng)對(duì)象小于265K時(shí)將直接由這片內(nèi)存池進(jìn)行分配內(nèi)存,否則將調(diào)用第0層中的C函數(shù)來(lái)分配內(nèi)存,當(dāng)小于265K的對(duì)象被銷毀時(shí), 其內(nèi)存也不會(huì)被銷毀, 只是返回給了內(nèi)存池以便二次利用。2層是對(duì)Python對(duì)象進(jìn)行操作。

  1. Python 多線程是什么?

Python中多線程由于有GIL的影響, 導(dǎo)致在任意時(shí)間內(nèi)只有一個(gè)線程在運(yùn)行,所以Python的多線程在處理計(jì)算密集型任務(wù)上效果反而不如單線程, 只有在處理IO密集型任務(wù)上多線程才能發(fā)揮實(shí)力,在等待IO過(guò)程中Python C源碼會(huì)釋放GIL, 最終會(huì)導(dǎo)致線程在等待IO過(guò)程中會(huì)被暫停去執(zhí)行其他的線程。python中GIL主要是由于歷史原因?qū)е翪python虛擬機(jī)中的GIL難以移除,同時(shí)GIL的存在保證了多線程之間數(shù)據(jù)完整性以及狀態(tài)同步。

  1. 說(shuō)明 os、sys 模塊不同,并列舉常用的模塊方法

os: 提供了對(duì)使用操作系統(tǒng)函數(shù)的高度封裝
sys: 提供由解釋器訪問(wèn)或者維護(hù)的變量以及與解釋器交互的一些函數(shù)
os模塊只負(fù)責(zé)程序與操作系統(tǒng)交互, 提供了訪問(wèn)操作系統(tǒng)底層的接口封裝。 sys模塊負(fù)責(zé)程序與解釋器交互, 提供了一系列的函數(shù)用于操控Python運(yùn)行的環(huán)境設(shè)置。
os模塊常用方法: os.getcwd() # 獲取當(dāng)前運(yùn)行路徑 os.remove() # 刪除指定的文件 os.walk() # 生成指定目錄下的文件夾以及文件 os.makedirs() # 生成多成目錄 os.mkdir() # 生成目錄 os.rmdir() # 刪除指定目錄 os.removedir() # 刪除多層目錄 os.listdir() # 列出指定目錄下所有的文件夾以及文件 os.path.join() # 將分離的各部分組合成一個(gè)路徑名 os.path.getsize() # 獲取指定文件大小 os.path.exists() # 查看指定目錄或者文件是否存在 os.path.isabs() # 查看指定目錄是否為絕對(duì)路徑 ... sys模塊常用方法: sys.argv# 命令行參數(shù)列表 sys.exit() # 退出程序并返回指定的整數(shù) sys.maxunicode # 最大的Unicode值 sys.modules # 系統(tǒng)導(dǎo)入的模塊名稱 sys.path # python搜索模塊時(shí)的路徑 sys.stdout # 標(biāo)準(zhǔn)輸出 sys.stdin # 標(biāo)準(zhǔn)輸入 sys.stderr # 錯(cuò)誤輸出 …

  1. 什么是 lambda 表達(dá)式?它有什么好處?

lambda也是函數(shù)的一種, 在處理一些簡(jiǎn)單的操作時(shí)可以使用該表達(dá)式, 其好處是不用為一些實(shí)現(xiàn)簡(jiǎn)單功能的函數(shù)命名,畢竟編程只有兩個(gè)難點(diǎn): 緩存失效, 命名。

  1. Python 里面如何拷貝一個(gè)對(duì)象?

Python中拷貝分為深拷貝、淺拷貝。淺拷貝只拷貝父級(jí)對(duì)象, 不會(huì)拷貝對(duì)象內(nèi)部的子對(duì)象,使用copy模塊中的copy。深拷貝則會(huì)完全拷貝父對(duì)象以及子對(duì)象, 使用copy模塊中的deepcopy。

  1. newinit 的區(qū)別。

new負(fù)責(zé)構(gòu)建一個(gè)類對(duì)象并將其返回,init則負(fù)責(zé)初始化一些變量,不返回任何對(duì)象。在實(shí)例化一個(gè)類時(shí), new方法將會(huì)先被運(yùn)行, 其次才運(yùn)行init方法。

  1. Python 中協(xié)程?

Python中協(xié)程最初使用yield來(lái)實(shí)現(xiàn), 當(dāng)程序運(yùn)行到y(tǒng)ield語(yǔ)句時(shí)就會(huì)將控制權(quán)交出來(lái)去執(zhí)行其他的函數(shù), 在Python3之前只能通過(guò)原生yield、greenlet以及Gevent第三方庫(kù)來(lái)實(shí)現(xiàn)協(xié)程, 在Python3 之后引入了yield from, yield from 用于重構(gòu)生成器。在Python3.5之后引用了async和await, 其作為yield from, yield的完美替身來(lái)實(shí)現(xiàn)協(xié)程。

  1. Python 的異常機(jī)制?

Python中異常也是一個(gè)對(duì)象, 所有的異常的基類都是Exception。捕獲異常使用try...except....語(yǔ)法,如果要try與except之間的代碼出現(xiàn)了錯(cuò)誤并且我們將其異常類型捕獲了那么代碼將會(huì)跳轉(zhuǎn)代except中去執(zhí)行。還可以使用raise 去手動(dòng)的觸發(fā)一個(gè)錯(cuò)誤,也可以使用assert來(lái)觸發(fā)異常, 只不過(guò)assert經(jīng)常用來(lái)在測(cè)試中, 并且assert對(duì)程序的性能有著極大影響,只有內(nèi)置的debug為T(mén)rue時(shí)assert才會(huì)執(zhí)行。

  1. Python 舊式類(經(jīng)典類)和新式類的區(qū)別?

經(jīng)典類與新式類的區(qū)別是:繼承搜索的順序發(fā)生了改變,經(jīng)典類多繼承搜索順序是深度優(yōu)先, 按照從左至右的查找,并且將每一個(gè)父類的基類都查找一遍。新式類則是, 先從左至右的查找, 然后再向每一個(gè)父類的基類進(jìn)行查找。(都是從左至右的順序查找, 經(jīng)典類查找一個(gè)父類時(shí)同時(shí)向上查找,新式類則是先查找所有的父類然后再向上查找)

  1. classmethod, staticmethod, property 是什么?有什么作用?

lassmethod,staticmethod,property都是裝飾器, 他們都作用在類的方法上。
classmethod:使得被裝飾的方法成為一個(gè)類方法既不需要實(shí)例化類就可以直接調(diào)用的方法,第一個(gè)參數(shù)為cls。
staticmethod: 使得被裝飾的方法成為一個(gè)靜態(tài)函數(shù)既與普通的函數(shù)無(wú)區(qū)別。 property: 將一個(gè)方法變成一個(gè)屬性來(lái)使用。

13 Python 中的綁定方法和未綁定方法是什么?

綁定方法:綁定了實(shí)例化的方法既第一個(gè)參數(shù)是self
未綁定方法:沒(méi)有綁定實(shí)例化的方法既類方法、靜態(tài)方法

  1. Python 上下文管理器是什么?

Python中上下文管理器使用with來(lái)調(diào)用主要用于數(shù)據(jù)庫(kù)連接,文件操作, 網(wǎng)絡(luò)操作。 其作用是: 如果在進(jìn)行一些打開(kāi)資源操作時(shí)出現(xiàn)了異常,上下文管理器將會(huì)自動(dòng)的執(zhí)行一些資源清理操作。在進(jìn)入上下文管理器時(shí), Python會(huì)先調(diào)用對(duì)象的enter方法, 該方法返回一個(gè)對(duì)象用于進(jìn)行一些操作,如果在進(jìn)行一些操作時(shí)發(fā)生了異常Python則調(diào)用exit該對(duì)象接受三個(gè)參數(shù)第一個(gè)參數(shù)異常類,第二個(gè)參數(shù)異常提示字符串, 第三個(gè)參數(shù)traceback對(duì)象。

  1. functools 的 wraps 是做什么的?

wraps是一個(gè)裝飾器功能是: 由于被裝飾的函數(shù)傳入到裝飾器中時(shí)已經(jīng)不是原函數(shù)了, 而是一個(gè)新的函數(shù), 并且丟失一些原函數(shù)的屬性, 為了不影響函數(shù)的使用, 可以使用wraps來(lái)抵消這種副作用。

  1. 請(qǐng)說(shuō)一說(shuō) ORM 實(shí)現(xiàn)原理

ORM使用了Python的屬性描述符協(xié)議實(shí)現(xiàn),通過(guò)另外一個(gè)類來(lái)描述類變量的屬性類型, 再給這個(gè)屬性進(jìn)行賦值時(shí)(對(duì)應(yīng)數(shù)據(jù)庫(kù)中的字段名稱)會(huì)調(diào)用set方法,訪問(wèn)屬性則會(huì)調(diào)用get方法刪除則調(diào)用delete方法。

  1. 請(qǐng)說(shuō)一說(shuō)迭代器和生成器區(qū)別?

生成器時(shí)一種特殊的迭代器, 生成器自動(dòng)實(shí)現(xiàn)了迭代器協(xié)議, 不需要手動(dòng)的實(shí)現(xiàn)iter以及next方法,生成器在迭代的過(guò)程中可以改變當(dāng)前的迭代值, 而普通的迭代器改變當(dāng)前值時(shí)往往會(huì)發(fā)生錯(cuò)。迭代器必須實(shí)現(xiàn)iter以及next方法。

  1. 描述一下 type() 的作用

當(dāng)type只傳入一個(gè)參數(shù)時(shí)將返回該參數(shù)的類型,如果傳入了三個(gè)參數(shù)則返回一個(gè)類對(duì)象,同時(shí)Python中的所有類的基類都是type

  1. Python 中列表與元組的異同?

相同: 列表和元組都是容器并且是可迭代對(duì)象,二者可以包含任意類型的對(duì)象。
不同:列表是可變的, 元組是不可變。

  1. Python 中的列表是如何實(shí)現(xiàn)的?

Python中的列表使用了分離式技術(shù)實(shí)現(xiàn)的動(dòng)態(tài)順序表。

  1. Python 中列表的索引查詢的時(shí)間復(fù)雜度是多少?

O(1)

  1. Python 字典的實(shí)現(xiàn)原理?

Python的字典使用了哈希表來(lái)儲(chǔ)存key、value,當(dāng)添加一個(gè)數(shù)據(jù)時(shí)首先會(huì)把key通過(guò)哈希函數(shù)轉(zhuǎn)換成一個(gè)數(shù)字, 然后將該數(shù)字對(duì)存放value的數(shù)組長(zhǎng)度取余并將取余結(jié)果當(dāng)做數(shù)組的下標(biāo), 將value存放在該取余結(jié)果為下標(biāo)的數(shù)組中。數(shù)據(jù)查詢時(shí)將key轉(zhuǎn)換為對(duì)應(yīng)的數(shù)組下標(biāo),并定位到數(shù)組的位置獲取value。

  1. 什么是 pickling 和 unpickling?

Pickle模塊讀入任何Python對(duì)象,將它們轉(zhuǎn)換成字符串,然后使用dump函數(shù)將其轉(zhuǎn)儲(chǔ)到一個(gè)文件中——這個(gè)過(guò)程叫做pickling,反之從存儲(chǔ)的字符串文件中提取原始Python對(duì)象的過(guò)程,叫做unpickling。

  1. 有哪些工具可以幫助 debug 或做靜態(tài)分析?

debug工具:pdb。靜態(tài)分析工具:pep8 / pycodestyle,Pyflakes,Pylint,flake8,Pysa,pytype,pyright,Pyre等

  1. Python 中的作用域?

在Python中,一個(gè)對(duì)象的作用于總是由代碼被賦值的地方所決定的。當(dāng)遇見(jiàn)一個(gè)變量時(shí)Python會(huì)按照: 本地作用域→ 當(dāng)前作用域被嵌入的本地作用域→ 全局/模塊作用域→ 內(nèi)置作用域順序搜索。

  1. Python 的參數(shù)傳遞是值傳遞還是引用傳遞?

可變對(duì)象使用引用傳遞, 不可變對(duì)象使用值傳遞

  1. 寫(xiě)一個(gè)函數(shù),輸入一個(gè)字符串,返回倒序排列的結(jié)果

def reverse(text):
return text[::-1]

  1. Python 中 is 和 == 的區(qū)別

is比較的是對(duì)象在內(nèi)存的地址, ==比較的對(duì)象中的值

  1. 什么是 Python 的閉包?

內(nèi)層函數(shù)引用了其外部作用域的變量,然后返回內(nèi)層函數(shù)的情況,稱為閉包,創(chuàng)建一個(gè)閉包必須滿足以下幾點(diǎn):

  1. 必須有一個(gè)內(nèi)嵌函數(shù)
  2. 內(nèi)嵌函數(shù)必須引用外部函數(shù)中的變量,外層空間中被引用的變量叫做層函數(shù)的環(huán)境變量
  3. 外部函數(shù)的返回值必須是內(nèi)嵌函數(shù)
  4. 環(huán)境變量和內(nèi)層非全局函數(shù)一起構(gòu)成了閉包
  1. Python 的自省?

type(),dir(),getattr(),hasattr(),isinstance()

  1. Python 并發(fā)的解決方案。

Twisted是一個(gè)事件驅(qū)動(dòng)型的網(wǎng)絡(luò)引擎,不同于單線程和多線程模式,這種模式不需要過(guò)多去關(guān)心線程鎖的問(wèn)題,當(dāng)遇到高并發(fā)問(wèn)題時(shí)候,采用twisted會(huì)很好解決數(shù)據(jù)共享的問(wèn)題。
Tornado既是一個(gè)web server,也是web framework。就是說(shuō)這個(gè)web框架有自己內(nèi)置的web server,在寫(xiě)web時(shí)候可以用到它的高性能網(wǎng)絡(luò)庫(kù),甚至有公司拿這個(gè)來(lái)做游戲的服務(wù)器,可以用它處理高并發(fā)問(wèn)題。 Gevent是基于協(xié)程的Python網(wǎng)絡(luò)庫(kù),基于libev的快速事件循環(huán),基于greenlet的輕量級(jí)執(zhí)行單元,API的概念和Python標(biāo)準(zhǔn)庫(kù)一致。
sanic基于uvloop和httptools實(shí)現(xiàn)高并發(fā)異步網(wǎng)絡(luò)框架。

?著作權(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),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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