1.*args和**kwargs是什麼意思?
答:*args表示可變參數(variadic arguments),它允許你傳入0個或任意個無名參數,這些參數在函數調用時自動組裝為一個tuple; **kwargs表示關鍵字參數(keyword arguments),它允許你傳入0個或任意個含參數名的參數,這些關鍵字參數在函數內部自動組裝為一個dict。同時使用*args和**kwargs的時候,必須保證*args在**kwargs之前。
2.python裡面如何拷貝一個對象?
答:
(1) 賦值(=),就是建立了對象的一個新的引用,修改其中任意一個變數都會影響到另一個;
(2)淺拷貝(copy.copy()),建立一個新的對象,但它包含的是對原始對象中包含項的引用(如果用引用的方式修改其中一個對象,另一個也會被改變);
(3)深拷貝(copy.deepcopy()),建立一個新的對象,並且遞迴的複製它所包含的對象(修改其中一個,另一個不會改變)
注意:並不是所有的對象都可以拷貝
3.簡要描述python的記憶體回收機制
答:python中的記憶體回收是以引用計數為主,標記-清除和分代收集為輔。
引用計數:python在記憶體中儲存每個對象的引用計數,如果計數變成0,該對象就會消失,分配給該對象的記憶體就會釋放出來。
標記-清除:一些容器物件,比如說list、dict、tuple、instance等可能會出現引用迴圈,對於這些迴圈,記憶體回收行程會定時回收這些迴圈(對象之間通過引用(指標)連在一起,構成一個有向圖,對象構成這個有向圖的節點,而參考關聯性構成這個有向圖的邊)。
分代收集:python把記憶體根據對象存活時間劃分為三代,對象建立之後,記憶體回收行程會分配它們所屬的代。每個對象都會被分配一個代,而被分配更年輕的代是被優先處理的,因此越晚建立的對象越容易被回收。
4.什麼是lambda函數?它有什麼好處?
答:lambda運算式,通常是在需要一個函數,但是又不想費神去命名一個函數的場合下使用,也就是指匿名函數。
Python允許你定義一種單行的小函數。定義lambda函數的形式如下(lambda參數:運算式)lambda函數預設返回運算式的值。你也可以將其賦值給一個變數。lambda函數可以接受任意個參數,包括選擇性參數,但是運算式只有一個。
5.python如何?單例模式?
答:單例模式是一種常用的軟體設計模式。在它的核心結構中只包含一個被稱為單例類的特殊類。通過單例模式可以保證系統中一個類只有一個單例而且該單例易於外界訪問,從而方便對執行個體個數的控制並節約系統資源。如果希望在系統中某個類的對象只能存在一個,單例模式是最好的解決方案。
__new__()在__init__()之前被調用,用於產生執行個體對象。利用這個方法和累的屬性的特點可以實現設計模式的單例模式。單例模式是指建立唯一對象,單例模式設計的類只能執行個體。
(1)使用__new__方法
class Singleton(object):def __new__(cls, *args, **kw):if not hasattr(cls, '_instance'):orig = super(Singleton, cls)cls._instance = orig.__new__(cls, *args, **kw)return cls._instanceclass MyClass(Singleton):a = 1
(2)共用屬性
class Borg(object):_state = {}def __new__(cls, *args, **kw):ob = super(Borg, cls).__new__(cls, *args, **kw)ob.__dict__ = cls._statereturn obclass MyClass2(Borg):a = 1
(3)裝飾器版本
def singleton(cls, *args, **kw):instances = {}def getinstance():if cls not in instances:instances[cls] = cls(*args, **kw)return instances[cls]return getinstance@singletonclass MyClass:...
(4)import方法
class My_Singleton(object):def foo(self):passmy_singleton = My_Singleton()# to usefrom mysingleton import my_singletonmy_singleton.foo()
6.python自省
答:自省就是物件導向的語言所寫的程式在運行時,所能知道對象的類型,簡單一句就是運行時能夠獲得對象的類型,比如type(),dir(),getattr(),hasattr(),isinstance().
a = [1,2,3]b = {'a':1,'b':2,'c':3}c = Trueprint type(a),type(b),type(c) # print isinstance(a,list) # True
7.談一談python的裝飾器
答:裝飾器本質上是一個python函數,它可以讓其他函數在不作任何變動的情況下增加額外功能,裝飾器的傳回值也是一個函數對象。它經常用於有切面需求的情境。比如:插入日誌、效能測試,交易處理、緩衝、許可權驗證等。有了裝飾器我們就可以抽離出大量的與函數功能無關的雷同代碼進行重用。
8.什麼是鴨子類型?
答:在鴨子類型中,關注的不是對象的類型本身,而是他如何使用的。例如,在不適用鴨子類型的語言中,我們可以編寫一個函數,它接受一個類型為鴨的對象,並調用它的走和叫方法。在使用鴨子類型的語言中,這樣的一個函數可以接受一個任意類型的對象,並調用它的走和叫方法。
class duck():def walk(self):print('I am duck,I can walk...')def swim(self):print('I am duck,I can swim...')def call(self):print('I am duck,I can call...')duck1=duck()duck1.walk()# I am duck,I can walk...duck1.call() # I am duck,I can call...
9.@classmethod和@staticmethod
答:@classmethod修飾符對應的函數不需要執行個體化,不需要self參數,第一個參數需要是表示自身類的cls參數,cls參數可以用來調用類的屬性,類的方法,執行個體化對象等。@staticmethod返回函數的靜態方法,該方法不強制要求傳遞參數,如下聲明一個靜態方法:
Class C(object):@staticmethodDef f(arg1, arg2,…):…
以上執行個體聲明了靜態方法f,類可以不用執行個體化就可以調用該方法C.f(),也可以執行個體化後調用C().f()。
10.談一談python中的元類
答:一般來說,我們都是在代碼裡定義類,用定義的類來建立執行個體。而使用元類,步驟又是同,定義元類,用元類建立類,再使用建立出來的類來建立執行個體。元類的主要目的就是為了當建立類時能夠自動地改變類。
184 次點擊