寫在前面
千呼萬喚始出來,咱們需要的面試文檔終于整理出來啦!這一次,為大家送上的是python面試題之基礎(chǔ)概念篇。通過對(duì)十幾份面試題目的整理,我們選出了其中出現(xiàn)頻率最高的十個(gè)題目,附上答案供各位小伙伴參考!
如果你是Python初學(xué)者,文末提供Python資料可下載看看。
1.*args和**kwargs是什么意思?
答:*args表示可變參數(shù)(variadic arguments),它允許你傳入0個(gè)或任意個(gè)無名參數(shù),這些參數(shù)在函數(shù)調(diào)用時(shí)自動(dòng)組裝為一個(gè)tuple; **kwargs表示關(guān)鍵字參數(shù)(keyword arguments),它允許你傳入0個(gè)或任意個(gè)含參數(shù)名的參數(shù),這些關(guān)鍵字參數(shù)在函數(shù)內(nèi)部自動(dòng)組裝為一個(gè)dict。同時(shí)使用*args和**kwargs的時(shí)候,必須保證*args在**kwargs之前。
在這里還是要推薦下我自己建的Python開發(fā)學(xué)習(xí)裙:304 零伍零 799,裙里都是學(xué)Python開發(fā)的,如果你正在學(xué)習(xí)Python ,小編歡迎你加入,大家都是軟件開發(fā)黨,不定期分享干貨(只有Python軟件開發(fā)相關(guān)的),包括我自己整理的一份2018最新的Python進(jìn)階資料和高級(jí)開發(fā)教程,歡迎進(jìn)階中和進(jìn)想深入Python的小伙伴
2.python里面如何拷貝一個(gè)對(duì)象?
答:
(1) 賦值(=),就是創(chuàng)建了對(duì)象的一個(gè)新的引用,修改其中任意一個(gè)變量都會(huì)影響到另一個(gè);
(2)淺拷貝(copy.copy()),創(chuàng)建一個(gè)新的對(duì)象,但它包含的是對(duì)原始對(duì)象中包含項(xiàng)的引用(如果用引用的方式修改其中一個(gè)對(duì)象,另一個(gè)也會(huì)被改變);
(3)深拷貝(copy.deepcopy()),創(chuàng)建一個(gè)新的對(duì)象,并且遞歸的復(fù)制它所包含的對(duì)象(修改其中一個(gè),另一個(gè)不會(huì)改變)
注意:并不是所有的對(duì)象都可以拷貝
3.簡(jiǎn)要描述python的垃圾回收機(jī)制
答:python中的垃圾回收是以引用計(jì)數(shù)為主,標(biāo)記-清除和分代收集為輔。
引用計(jì)數(shù):python在內(nèi)存中存儲(chǔ)每個(gè)對(duì)象的引用計(jì)數(shù),如果計(jì)數(shù)變成0,該對(duì)象就會(huì)消失,分配給該對(duì)象的內(nèi)存就會(huì)釋放出來。
標(biāo)記-清除:一些容器對(duì)象,比如說list、dict、tuple、instance等可能會(huì)出現(xiàn)引用循環(huán),對(duì)于這些循環(huán),垃圾回收器會(huì)定時(shí)回收這些循環(huán)(對(duì)象之間通過引用(指針)連在一起,構(gòu)成一個(gè)有向圖,對(duì)象構(gòu)成這個(gè)有向圖的節(jié)點(diǎn),而引用關(guān)系構(gòu)成這個(gè)有向圖的邊)。
分代收集:python把內(nèi)存根據(jù)對(duì)象存活時(shí)間劃分為三代,對(duì)象創(chuàng)建之后,垃圾回收器會(huì)分配它們所屬的代。每個(gè)對(duì)象都會(huì)被分配一個(gè)代,而被分配更年輕的代是被優(yōu)先處理的,因此越晚創(chuàng)建的對(duì)象越容易被回收。
4.什么是lambda函數(shù)?它有什么好處?
答:lambda表達(dá)式,通常是在需要一個(gè)函數(shù),但是又不想費(fèi)神去命名一個(gè)函數(shù)的場(chǎng)合下使用,也就是指匿名函數(shù)。
Python允許你定義一種單行的小函數(shù)。定義lambda函數(shù)的形式如下(lambda參數(shù):表達(dá)式)lambda函數(shù)默認(rèn)返回表達(dá)式的值。你也可以將其賦值給一個(gè)變量。lambda函數(shù)可以接受任意個(gè)參數(shù),包括可選參數(shù),但是表達(dá)式只有一個(gè)。
5.python如何實(shí)現(xiàn)單例模式?
答:?jiǎn)卫J绞且环N常用的軟件設(shè)計(jì)模式。在它的核心結(jié)構(gòu)中只包含一個(gè)被稱為單例類的特殊類。通過單例模式可以保證系統(tǒng)中一個(gè)類只有一個(gè)單例而且該單例易于外界訪問,從而方便對(duì)實(shí)例個(gè)數(shù)的控制并節(jié)約系統(tǒng)資源。如果希望在系統(tǒng)中某個(gè)類的對(duì)象只能存在一個(gè),單例模式是最好的解決方案。
__new__()在__init__()之前被調(diào)用,用于生成實(shí)例對(duì)象。利用這個(gè)方法和累的屬性的特點(diǎn)可以實(shí)現(xiàn)設(shè)計(jì)模式的單例模式。單例模式是指創(chuàng)建唯一對(duì)象,單例模式設(shè)計(jì)的類只能實(shí)例。
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._instance
class 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 ob
class 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
@singleton
class MyClass:
...
4.import方法
class My_Singleton(object):
def foo(self):
pass
my_singleton = My_Singleton()
# to use
from mysingleton import my_singleton
my_singleton.foo()
6.python自省
答:自省就是面向?qū)ο蟮恼Z言所寫的程序在運(yùn)行時(shí),所能知道對(duì)象的類型,簡(jiǎn)單一句就是運(yùn)行時(shí)能夠獲得對(duì)象的類型,比如type(),dir(),getattr(),hasattr(),isinstance().
a = [1,2,3]
b = {'a':1,'b':2,'c':3}
c = True
print type(a),type(b),type(c) #
print isinstance(a,list) # True
7.談一談python的裝飾器
答:裝飾器本質(zhì)上是一個(gè)python函數(shù),它可以讓其他函數(shù)在不作任何變動(dòng)的情況下增加額外功能,裝飾器的返回值也是一個(gè)函數(shù)對(duì)象。它經(jīng)常用于有切面需求的場(chǎng)景。比如:插入日志、性能測(cè)試,事務(wù)處理、緩存、權(quán)限驗(yàn)證等。有了裝飾器我們就可以抽離出大量的與函數(shù)功能無關(guān)的雷同代碼進(jìn)行重用。
8.什么是鴨子類型?
答:在鴨子類型中,關(guān)注的不是對(duì)象的類型本身,而是他如何使用的。例如,在不適用鴨子類型的語言中,我們可以編寫一個(gè)函數(shù),它接受一個(gè)類型為鴨的對(duì)象,并調(diào)用它的走和叫方法。在使用鴨子類型的語言中,這樣的一個(gè)函數(shù)可以接受一個(gè)任意類型的對(duì)象,并調(diào)用它的走和叫方法。
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...
Python學(xué)習(xí)書籍推薦
很多人在問,學(xué)習(xí)Python讀什么書,這其實(shí)是一個(gè)非常通用的問題,學(xué)習(xí)分為2種方式:看書、上課,而讀書學(xué)習(xí)是最實(shí)惠也是最高效的一種,小編整理了一些Python高分書籍給大家,從0基礎(chǔ)到高級(jí)適合不同學(xué)習(xí)階段,希望大家學(xué)習(xí)愉快。獲取方式關(guān)注微信公眾號(hào):程序員大牛”即可下載。