10個(gè)Python面試常問(wèn)的問(wèn)題

概述

Python是個(gè)非常受歡迎的編程語(yǔ)言,隨著近些年機(jī)器學(xué)習(xí)、云計(jì)算等技術(shù)的發(fā)展,Python的職位需求越來(lái)越高。下面我收集了10個(gè)Python面試官經(jīng)常問(wèn)的問(wèn)題,供大家參考學(xué)習(xí)。

1、類(lèi)繼承

有如下的一段代碼:

classA(object):

defshow(self):

print'base show'

classB(A):

defshow(self):

print'derived show'

obj = B()

obj.show()

如何調(diào)用類(lèi)A的show方法了。

方法如下:

obj.__class__ = Aobj.show()

__class__方法指向了類(lèi)對(duì)象,只用給他賦值類(lèi)型A,然后調(diào)用方法show,但是用完了記得修改回來(lái)。

2、方法對(duì)象

問(wèn)題:為了讓下面這段代碼運(yùn)行,需要增加哪些代碼?

classA(object):

def__init__(self,a,b):

self.__a = a

self.__b = b

defmyprint(self):

print'a=', self.__a,'b=', self.__b

a1=A(10,20)

a1.myprint()

a1(80)

答案:為了能讓對(duì)象實(shí)例能被直接調(diào)用,需要實(shí)現(xiàn)__call__方法

classA(object):

def__init__(self, a, b):

self.__a = a

self.__b = b

defmyprint(self):

print'a=', self.__a,'b=', self.__b

def__call__(self, num):

print'call:', num + self.__a

3、new和init

下面這段代碼輸出什么?

classB(object):

deffn(self):

print'B fn'

def__init__(self):

print"B INIT"

classA(object):

deffn(self):

print'A fn'

def__new__(cls,a):

print"NEW", a

ifa>10:

returnsuper(A, cls).__new__(cls)

returnB()

def__init__(self,a):

print"INIT", a

a1 = A(5)

a1.fn()

a2=A(20)

a2.fn()

答案:

NEW5

B INIT

B fn

NEW20

INIT20

A fn

使用__new__方法,可以決定返回那個(gè)對(duì)象,也就是創(chuàng)建對(duì)象之前,這個(gè)可以用于設(shè)計(jì)模式的單例、工廠模式。__init__是創(chuàng)建對(duì)象是調(diào)用的。

4、Python list和dict生成

下面這段代碼輸出什么?

ls = [1,2,3,4]

list1 = [iforiinlsifi>2]

printlist1

list2 = [i*2foriinlsifi>2]

printlist2

dic1 = {x: x**2forxin(2,4,6)}

printdic1

dic2 = {x:'item'+ str(x**2)forxin(2,4,6)}

printdic2

set1 = {xforxin'hello world'ifxnotin'low level'}

printset1

答案:

[3,4]

[6,8]

{2:4,4:16,6:36}

{2:'item4',4:'item16',6:'item36'}

set(['h','r','d'])

5、全局和局部變量

下面這段代碼輸出什么?

num =9

deff1():

num =20

deff2():

printnum

f2()

f1()

f2()

答案:

9

9

num不是個(gè)全局變量,所以每個(gè)函數(shù)都得到了自己的num拷貝,如果你想修改num,則必須用global關(guān)鍵字聲明。比如下面這樣

num =9

deff1():

globalnum

num =20

deff2():

printnum

f2()

f1()

f2()

# prints:

# ? ? ?9

# ? ? ?20

6、交換兩個(gè)變量的值

一行代碼交換兩個(gè)變量值

a=8

b=9

答案:

(a,b) = (b,a)

7、默認(rèn)方法

如下的代碼

classA(object):

def__init__(self,a,b):

self.a1 = a

self.b1 = b

print'init'

defmydefault(self):

print'default'

a1 = A(10,20)

a1.fn1()

a1.fn2()

a1.fn3()

方法 fn1/fn2/fn3 都沒(méi)有定義,添加代碼,是沒(méi)有定義的方法都調(diào)用mydefault函數(shù),上面的代碼應(yīng)該輸出

defaultdefaultdefault

答案:

classA(object):

def__init__(self,a,b):

self.a1 = a

self.b1 = b

print'init'

defmydefault(self):

print'default'

def__getattr__(self,name):

returnself.mydefault

a1 = A(10,20)

a1.fn1()

a1.fn2()

a1.fn3()

方法__getattr__只有當(dāng)沒(méi)有定義的方法調(diào)用時(shí),才是調(diào)用他。當(dāng)fn1方法傳入?yún)?shù)時(shí),我們可以給mydefault方法增加一個(gè)*args不定參數(shù)來(lái)兼容。

classA(object):

def__init__(self,a,b):

self.a1 = a

self.b1 = b

print'init'

defmydefault(self,*args):

print'default:'+ str(args[0])

def__getattr__(self,name):

print"other fn:",name

returnself.mydefault

a1 = A(10,20)

a1.fn1(33)

a1.fn2('hello')

a1.fn3(10)

8、包管理

一個(gè)包里有三個(gè)模塊,mod1.py, mod2.py, mod3.py,但使用from demopack import *導(dǎo)入模塊時(shí),如何保證只有mod1、mod3被導(dǎo)入了。

答案:增加__init__.py文件,并在文件中增加:

__all__ = ['mod1','mod3']

9、閉包

寫(xiě)一個(gè)函數(shù),接收整數(shù)參數(shù)n,返回一個(gè)函數(shù),函數(shù)的功能是把函數(shù)的參數(shù)和n相乘并把結(jié)果返回。

答案:

defmulby(num):

defgn(val):

returnnum * val

returngn

zw = mulby(7)

print(zw(9));

10、性能

解析下面的代碼慢在哪

defstrtest1(num):

str='first'

foriinrange(num):

str+="X"

returnstr

答案:python的str是個(gè)不可變對(duì)象,每次迭代,都會(huì)生成新的str對(duì)象來(lái)存儲(chǔ)新的字符串,num越大,創(chuàng)建的str對(duì)象越多,內(nèi)存消耗越大。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容