1. 程式人生 > >常見的Python面試題+詳細解答

常見的Python面試題+詳細解答

常見面試題整理–Python概念篇

(一),這兩個引數是什麼意思:*args,**kwargs?我們為什麼要使用它們?

答:如果我們不確定往一個函式中傳入多少引數,或者我們希望以元組(tuple)或者列表(list)的形式傳引數的時候,我們可以使用*args(單星號).如果我們不知道往函式中傳遞多少個關鍵詞引數或者想傳入字典的值作為關鍵詞引數的時候我們可以使用**kwargs(雙星號),args,kwargs兩個識別符號是約定俗成的用法。
另一種答法:當函式的引數前面有一個星號*號的時候表示這是一個可變得位置引數,兩個星號**表示這是一個可變的關鍵詞引數。星號*把序列或者集合解包(uppack)成位置引數,兩個星號**把字典解包成關鍵詞引數。
程式碼輔助理解:

tempList = [1,2,3]
tempTuple = (2,3,4)
tempDict = {'s':3,'m':4,'c':5}

def testFunc(*args,**kwargs):
    print args,kwargs

testFunc()#() {}
testFunc(*tempList)#(1,2,3) {}
testFunc(*tempTuple)#(2,3,4) {}
testFunc(*tempDict)#('s','m','c') {}
testFunc(**tempDict)#() {'s':3,'m':4,'c':5}
testFunc(*tempList,**tempDict)#(1
,2,3)
{'s':3,'m':4,'c':5} testFunc(0)#(0,) {} testFunc(0,*tempList)#(0,1,2,3) {} testFunc(0,**tempDict)#(0,) {'s':3,'m':4,'c':5} testFunc(0,*tempList,tempName = 'bye',**tempDict)#(0,1,2,3) {'s':3,'m':4,'c':5,'tempName':'bye'}
(二),談一談Python的裝飾器(decorator)

裝飾器本質上是一個Python函式,它可以讓其它函式在不做任何變動的情況下增加額外功能,裝飾器的返回值也是一個函式物件。他經常用於有切面需求的場景。比如:插入日誌,效能測試,事務處理,快取,許可權校驗等。有了裝飾器我們就可以抽離出大量的與函式功能無關的雷同程式碼進行重用。
有關於具體的裝飾器的用法看這裡:

裝飾器-廖雪峰的官方網站

(三),簡要概述Python的垃圾回收機制(garbage collection)

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

  • 引用計數:Python在記憶體中儲存每個物件的引用計數,如果計數變為0,該物件就會消失,分配給該物件的記憶體就會釋放出來。
  • 標記-清除:一些容器物件,比如list,dict,tuple,instance等可能會出現引用迴圈,對於這些迴圈,垃圾回收器會定時回收這些迴圈(物件之間通過引用(指標)連在一起,構成一個有向圖,物件構成這個有向圖的結點,而引用關係構成這個有向圖的邊).
  • 分代收集:Python把記憶體根據物件存活時間劃分為三代,物件建立之後,垃圾回收器會分配它們所屬的代。每個物件都會被分配一個代,而被分配更年輕的代是被優先處理的,因此越晚建立的物件越容易被回收。
    未完待續!