天天看點

十二道常見的Python面試題

文章目錄

               1.這兩個參數是什麼意思:\*args,\**kwargs?我們為什麼要使用它們?

               2.談一談Python的裝飾器(decorator)

               3.簡要描述Python的垃圾回收機制(garbage collection)

               4.Python多線程(mlti-threading)。這是個好主意嗎?

               5.說明os.sys子產品不同,并列舉常用的子產品方法?

               6.什麼是lmbda表達式?它有什麼好處?

               7.Python中pass語句的作用是什麼?

               8.Python是如何進行類型轉換的?

               9.Python裡面如何拷貝一個對象?

               10.__new__和__init__的差別

               11.Python中單下劃線和雙下劃線分别是什麼?

               12.說一說Python自省

1.這兩個參數是什麼意思:*args,**kwargs?我們為什麼要使用它們?

答:當函數的參數的參數前面有一個星号的時候表示這是一個可變的位置參數,兩個星号**的時候表示這是一個可變的關鍵詞參數,一個星号把序列或者集合解包(unpack)成位置參數,兩個星号**把字典解包成關鍵詞參數。

十二道常見的Python面試題

2.談一談Python的裝飾器(decorator)

裝飾器本質上是一個Python函數,它可以讓其它函數不變動的情況下增加新的功能,裝飾器的傳回值也是以一個函數。它經常用于有切面需求的場景。比如:插入日志,性能測試,緩存,事務處理,權限校驗等。有了裝飾器我們就可以抽出大量與函數無關的雷同代碼進行重用。

十二道常見的Python面試題

3.簡要描述Python的垃圾回收機制(garbage collection)

Python中的垃圾回收是以引用計數為主,标記-清除和分代收集為輔。

   引用計數:Python在記憶體中存儲每個對象的引用計數,如果計數變成0,該對象就會消失,配置設定給該對象的記憶體就會釋放出來。

   标記-清除:一些容器對象,比如list、dict、tuple,instance等可能會出現引用循環,對于這些循環,垃圾回收器會定時回收這些循環(對象之間通過引用(指針)連在一起,構成一個有向圖,對象構成這個有向圖的節點,而引用關系構成這個有向圖的邊)。

   分代收集:Python把記憶體根據對象存活時間劃分為三代,對象建立之後,垃圾回收器會配置設定它們所屬的代。每個對象都會被配置設定一個代,而被配置設定更年輕的代是被優先處理的,是以越晚建立的對象越容易被回收。

4.Python多線程(mlti-threading)。這是個好主意嗎?

Python并不支援真正意義上的多線程,Python提供了多線程包。Python中有一個叫Global Interpreter Lock(GIL)的東西,它能確定你的代碼中永遠隻有一個線程在執行。經過GIL的處理,會增加執行的開銷。這就意味着如果你先要提高代碼執行效率,使用threading不是一個明智的選擇,當然如果你的代碼是IO密集型,多線程可以明顯提高效率,相反如果你的代碼是CPU密集型的這種情況下多線程大部分是雞肋。

5.說明os.sys子產品不同,并列舉常用的子產品方法?

官方文檔:

   os模闆提供了一種友善的使用作業系統函數的方法

   sys模闆可供通路由解釋器使用或維護的變量和與解釋器互動的函數

另一種回答:

os子產品負責程式與作業系統的互動,提供了通路作業系統底層的接口。sys子產品負責程式與Python解釋器的互動,提供了一系列的函數和變量使用者操作Python運作時的環境。一些常用的方法:

十二道常見的Python面試題
十二道常見的Python面試題
十二道常見的Python面試題

6.什麼是lmbda表達式?它有什麼好處?

簡單來說,lambda表達式通常是當你需要使用一個函數,但是又不想費腦袋去命名一個函數的時候使用,也就是通常所說的匿名函數。

lambda表達式一般的形式是:關鍵詞lambda後面緊接一個或多個參數,緊接一個冒号“:”,緊接一個表達式。lambda表達式是一個表達式不是一個語句。

十二道常見的Python面試題

7.Python中pass語句的作用是什麼?

pass語句不會執行任何操作,一般作為占位符或者建立占位程式

8.Python是如何進行類型轉換的?

Python提供了将變量或值從一種類型轉換為另一種類型的内置方法。

十二道常見的Python面試題

9.Python裡面如何拷貝一個對象?

Python中對象之間的指派是按引用傳遞的,如果要拷貝對象需要使用标準模闆中的copy

copy.copy:淺拷貝,隻拷貝父對象,不拷貝父對象的子對象。

copy.deepcopy:深拷貝,拷貝父對象和子對象。

十二道常見的Python面試題

10.__new__和__init__的差別

__init__為初始化方法,__new__方法是真正的構造函數。

__new__是執行個體建立之前被調用,它的任務是建立并傳回該執行個體,是靜态方法

__init__是執行個體建立之後被調用的,然後設定對象屬性的一些初始值。

總結:__new__方法在__init__方法之前被調用,并且__new__方法的傳回值将傳遞給__init__方法作為第一個參數,最後__init__給這個執行個體設定一些參數。

十二道常見的Python面試題

11.Python中單下劃線和雙下劃線分别是什麼?

name:一種約定,Python内部的名字,用來與使用者自定義的名字區分開,防止沖突

_name:一種約定,用來指定變量私有

__name:解釋器用_classname__name來代替這個名字用以差別和其他類相同的命名

想要更加詳細的了解這兩者的差別

12.說一說Python自省

自省就是面向對象的語言所寫的程式在運作時,所能知道對象的類型。簡單一句話就是運作時能夠獲得對象的類型。比如:type()、dir()、getattr()、hasattr()、isinstance()

十二道常見的Python面試題