python面試題 2
希望此文可以長期更新並作為一篇Python的面試寶典。每一道題目都附有詳細解答,以及更加詳細的回答連結。此篇是概念篇,下一篇會更新面試題程式碼篇。
(一)、這兩個引數是什麼意思:*args,**kwargs?我們為什麼要使用它們?
答:如果我們不確定往一個函式中傳入多少引數,或者我們希望以元組(tuple)或者列表(list)的形式傳引數的時候,我們可以使用*args(單星號)。如果我們不知道往函式中傳遞多少個關鍵詞引數或者想傳入字典的值作為關鍵詞引數的時候我們可以使用**kwargs(雙星號),args、kwargs兩個識別符號是約定俗成的用法。
另一種答法:當函式的引數前面有一個星號*號的時候表示這是一個可變的位置引數,兩個星號**表示這個是一個可變的關鍵詞引數。星號*把序列或者集合解包(unpack)成位置引數,兩個星號**把字典解包成關鍵詞引數。
程式碼輔助理解:
(二)、談一談Python的裝飾器(decorator)
裝飾器本質上是一個Python函式,它可以讓其它函式在不作任何變動的情況下增加額外功能,裝飾器的返回值也是一個函式物件。它經常用於有切面需求的場景。比如:插入日誌、效能測試、事務處理、快取、許可權校驗等。有了裝飾器我們就可以抽離出大量的與函式功能無關的雷同程式碼進行重用。
(三)、簡要描述Python的垃圾回收機制(garbage collection)
Python中的垃圾回收是以引用計數為主,標記-清除和分代收集為輔。
- 引用計數:Python在記憶體中儲存每個物件的引用計數,如果計數變成0,該物件就會消失,分配給該物件的記憶體就會釋放出來。
- 標記-清除:一些容器物件,比如list、dict、tuple,instance等可能會出現引用迴圈,對於這些迴圈,垃圾回收器會定時回收這些迴圈(物件之間通過引用(指標)連在一起,構成一個有向圖,物件構成這個有向圖的節點,而引用關係構成這個有向圖的邊)。
- 分代收集:Python把記憶體根據物件存活時間劃分為三代,物件建立之後,垃圾回收器會分配它們所屬的代。每個物件都會被分配一個代,而被分配更年輕的代是被優先處理的,因此越晚建立的物件越容易被回收。
(四)、Python多執行緒(multi-threading)。這是個好主意嗎?
Python並不支援真正意義上的多執行緒,Python提供了多執行緒包。Python中有一個叫Global Interpreter Lock(GIL)的東西,它能確保你的程式碼中永遠只有一個執行緒在執行。經過GIL的處理,會增加執行的開銷。這就意味著如果你先要提高程式碼執行效率,使用threading不是一個明智的選擇,當然如果你的程式碼是IO密集型,多執行緒可以明顯提高效率,相反如果你的程式碼是CPU密集型的這種情況下多執行緒大部分是雞肋。
(五)、 說明os,sys模組不同,並列舉常用的模組方法?
官方文件:
- os模板提供了一種方便的使用作業系統函式的方法
- sys模板可供訪問由直譯器使用或維護的變數和與直譯器互動的函式
另一種回答:
os模組負責程式與作業系統的互動,提供了訪問作業系統底層的介面。sys模組負責程式與Python直譯器的互動,提供了一系列的函式和變數使用者操作Python執行時的環境。
一些常用的方法:一些常用的用法示例:
(六)、什麼是lambda表示式?它有什麼好處?
簡單來說,lambda表示式通常是當你需要使用一個函式,但是又不想費腦袋去命名一個函式的時候使用,也就是通常所說的匿名函式。
lambda表示式一般的形式是:關鍵詞lambda後面緊接一個或多個引數,緊接一個冒號“:”,緊接一個表示式。lambda表示式是一個表示式不是一個語句。
(七)、Python中pass語句的作用是什麼?
pass語句不會執行任何操作,一般作為佔位符或者建立佔位程式
(八)、Python是如何進行型別轉換的?
Python提供了將變數或值從一種型別轉換為另一種型別的內建方法。 (九)、Python裡面如何拷貝一個物件?
Python中物件之間的賦值是按引用傳遞的,如果要拷貝物件需要使用標準模板中的copy
- copy.copy:淺拷貝,只拷貝父物件,不拷貝父物件的子物件。
- copy.deepcopy:深拷貝,拷貝父物件和子物件。
(十)、__new__和__init__的區別。
- __init__為初始化方法,__new__方法是真正的建構函式。
- __new__是例項建立之前被呼叫,它的任務是建立並返回該例項,是靜態方法
- __init__是例項建立之後被呼叫的,然後設定物件屬性的一些初始值。
總結:__new__方法在__init__方法之前被呼叫,並且__new__方法的返回值將傳遞給__init__方法作為第一個引數,最後__init__給這個例項設定一些引數。
(十一)、Python中單下劃線和雙下劃線分別是什麼?
- __name__:一種約定,Python內部的名字,用來與使用者自定義的名字區分開,防止衝突
- _name:一種約定,用來指定變數私有
- __name:直譯器用_classname__name來代替這個名字用以區別和其他類相同的命名
(十二)、說一說Python自省。
自省就是面向物件的語言所寫的程式在執行時,所能知道物件的型別。簡單一句話就是執行時能夠獲得物件的型別。比如:type()、dir()、getattr()、hasattr()、isinstance()
有關於元類以及單例模式會在後面文章中做詳細的解釋說明。
本文參考文獻資料: