歡迎關注公衆號:程序員面試經驗分享(jobbible)
千爲大家送上的是python面試題之基礎概念篇。通過對十幾份面試題目的整理,我們選出了其中出現頻率最高的十個題目
1.*args和**kwargs是什麼意思?
答:*args表示可變參數(variadic arguments),它允許你傳入0個或任意個無名參數,這些參數在函數調用時自動組裝爲一個tuple; **kwargs表示關鍵字參數(keyword arguments),它允許你傳入0個或任意個含參數名的參數,這些關鍵字參數在函數內部自動組裝爲一個dict。同時使用*args和**kwargs的時候,必須保證*args在**kwargs之前。
擴展閱讀:
https://blog.csdn.net/mbugatti/article/details/53884455
2.python裏面如何拷貝一個對象?
答:
(1) 賦值(=),就是創建了對象的一個新的引用,修改其中任意一個變量都會影響到另一個;
(2)淺拷貝(copy.copy()),創建一個新的對象,但它包含的是對原始對象中包含項的引用(如果用引用的方式修改其中一個對象,另一個也會被改變);
(3)深拷貝(copy.deepcopy()),創建一個新的對象,並且遞歸的複製它所包含的對象(修改其中一個,另一個不會改變)
注意:並不是所有的對象都可以拷貝
擴展閱讀:
http://www.cnblogs.com/wilber2013/p/4645353.html
3.簡要描述python的垃圾回收機制
答:python中的垃圾回收是以引用計數爲主,標記-清除和分代收集爲輔。
引用計數:python在內存中存儲每個對象的引用計數,如果計數變成0,該對象就會消失,分配給該對象的內存就會釋放出來。
標記-清除:一些容器對象,比如說list、dict、tuple、instance等可能會出現引用循環,對於這些循環,垃圾回收器會定時回收這些循環(對象之間通過引用(指針)連在一起,構成一個有向圖,對象構成這個有向圖的節點,而引用關係構成這個有向圖的邊)。
分代收集:python把內存根據對象存活時間劃分爲三代,對象創建之後,垃圾回收器會分配它們所屬的代。每個對象都會被分配一個代,而被分配更年輕的代是被優先處理的,因此越晚創建的對象越容易被回收。
擴展閱讀:
https://www.jianshu.com/p/1e375fb40506
4.什麼是lambda函數?它有什麼好處?
答:lambda表達式,通常是在需要一個函數,但是又不想費神去命名一個函數的場合下使用,也就是指匿名函數。
Python允許你定義一種單行的小函數。定義lambda函數的形式如下(lambda參數:表達式)lambda函數默認返回表達式的值。你也可以將其賦值給一個變量。lambda函數可以接受任意個參數,包括可選參數,但是表達式只有一個。
擴展閱讀:
https://www.zhihu.com/question/20125256
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._state return 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()
擴展閱讀:
https://blog.csdn.net/sirodeng/article/details/17426543
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
擴展閱讀:
https://kb.cnblogs.com/page/87128/
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...
擴展閱讀:
https://blog.csdn.net/handsomekang/article/details/40270009
9.@classmethod和@staticmethod
答:@classmethod修飾符對應的函數不需要實例化,不需要self參數,第一個參數需要是表示自身類的cls參數,cls參數可以用來調用類的屬性,類的方法,實例化對象等。@staticmethod返回函數的靜態方法,該方法不強制要求傳遞參數,如下聲明一個靜態方法:
Class C(object):
@staticmethod
Def f(arg1, arg2,…):
…
以上實例聲明瞭靜態方法f,類可以不用實例化就可以調用該方法C.f(),也可以實例化後調用C().f()。
擴展閱讀:
https://zhuanlan.zhihu.com/p/28010894
10.談一談python中的元類
答:一般來說,我們都是在代碼裏定義類,用定義的類來創建實例。而使用元類,步驟又是同,定義元類,用元類創建類,再使用創建出來的類來創建實例。元類的主要目的就是爲了當創建類時能夠自動地改變類。
擴展閱讀:
https://blog.csdn.net/wenyu826/article/details/66972933
請輸入標題 bcdef
本文參考文檔:
1. github“hackerxu”:關於Python的面試題
2. 知乎專欄“python爬蟲實戰”:python面試指南
3. 51CTO“老男孩python”:2018python面試必看的10個問題及答案
4. 老左的博客:python面試必須要看的15個問題
5. CSDN“劉元濤”:python工程師面試題集合
6. 知乎“路人甲”:常見的面試題整理——python概念篇
請輸入標題 abcdefg
如果你在面試中也曾遇到過一些讓你“眼前一亮”的經典題目,或者,那些年你也有關於面試的難(cao)忘(dan)回憶,歡迎留言討論!