當前位置:
首頁 > 知識 > 10個Python常見面試題,這些弄不明白不要說學過Python!

10個Python常見面試題,這些弄不明白不要說學過Python!

 

源 / 

網路 

 

 

文 

笨熊   編

 

/ AI時間


概述


Python是個非常受歡迎的編程語言,隨著近些年機器學習、雲計算等技術的發展,Python的職位需求越來越高。下面我收集了10個Python面試官經常問的問題,供大家參考學習。


1、類繼承


有如下的一段代碼:

class

A

(object)

:

   

def

show

(self)

:


       

print

"base show"

class

B

(A)

:

   

def

show

(self)

:


       

print

"derived show"

obj = B()
obj.show()


如何調用類A的show方法了。 方法如下:

obj.__class__ = A
obj.show()


class 方法指向了類對象,只用給他賦值類型A,然後調用方法show,但是用完了記得修改回來。


2、方法對象


問題:為了讓下面這段代碼運行,需要增加哪些代碼?

class

A

(object)

:


   

def

__init__

(self,a,b)

:


       self.__a = a
       self.__b = b
   

def

myprint

(self)

:


       

print

"a="

, self.__a,

"b="

, self.__b

a1=A(

10

,

20

)
a1.myprint()

a1(

80

)


答案:為了能讓對象實例能被直接調用,需要實現call方法

class

A

(object)

:


   

def

__init__

(self, a, b)

:


       self.__a = a
       self.__b = b
   

def

myprint

(self)

:

       

print

"a="

, self.__a,

"b="

, self.__b
   

def

__call__

(self, num)

:


       

print

"call:"

, num + self.__a


3、new和init


下面這段代碼輸入什麼?

class

B

(object)

:


   

def

fn

(self)

:


       

print

"B fn"


   

def

__init__

(self)

:


       

print

"B INIT"

class

A

(object)

:


   

def

fn

(self)

:


       

print

"A fn"

   

def

__new__

(cls,a)

:


           

print

"NEW"

, a
           

if

a>

10

:
               

return

super(A, cls).__new__(cls)
           

return

B()

   

def

__init__

(self,a)

:


       

print

"INIT"

, a

a1 = A(

5

)
a1.fn()
a2=A(

20

)
a2.fn()


答案:

NEW

5


B INIT
B fn
NEW

20


INIT

20


A fn


使用new方法,可以決定返回那個對象,也就是創建對象之前,這個可以用於設計模式的單例、工廠模式。init是創建對象是調用的。


4、Python list和dict生成


下面這段代碼輸出什麼?

ls = [

1

,

2

,

3

,

4

]
list1 = [i

for

i

in

ls

if

i>

2

]
print(list1)

list2 = [i*

2

for

i

in

ls

if

i>

2

]
print(list2)

dic1 = {x: x**

2

for

x

in

(

2

,

4

,

6

)}
print(dic1)

dic2 = {x:

"item"

+ str(x**

2

)

for

x

in

(

2

,

4

,

6

)}
print(dic2)

set1 = {x

for

x

in

"hello world"

if

x

not

in

"low level"

}
print(set1)


答案:

[

3

,

4

]  
[

6

,

8

]
{

2

:

4

,

4

:

16

,

6

:

36

}
{

2

:

"item4"

,

4

:

"item16"

,

6

:

"item36"

}
set([

"h"

,

"r"

,

"d"

])


5、全局和局部變數


下面這段代碼輸出什麼?

num =

9

def

f1

()

:


   num =

20

def

f2

()

:


   

print

num

f2()
f1()
f2()


答案:

9


9


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

num =

9

def

f1

()

:


   

global

num
   num =

20

def

f2

()

:


 

print

num

f2()
f1()
f2()

# prints:


#      9


#      20


6、交換兩個變數的值


一行代碼交換兩個變數值

a=8
b=9


答案:

(a,b) = (b,a)


7、默認方法


如下的代碼

class

A

(object)

:


   

def

__init__

(self,a,b)

:


       self.a1 = a
       self.b1 = b
       

print

"init"


   

def

mydefault

(self)

:


       

print

"default"

a1 = A(

10

,

20

)
a1.fn1()
a1.fn2()
a1.fn3()


方法 fn1/fn2/fn3 都沒有定義,添加代碼,是沒有定義的方法都調用mydefault函數,上面的代碼應該輸出

default
default
default


答案:

class

A

(object)

:


   

def

__init__

(self,a,b)

:


       self.a1 = a
       self.b1 = b
       

print

"init"


   

def

mydefault

(self)

:


       

print

"default"


   

def

__getattr__

(self,name)

:


       

return

self.mydefault

a1 = A(

10

,

20

)
a1.fn1()
a1.fn2()
a1.fn3()


方法getattr只有當沒有定義的方法調用時,才是調用他。當fn1方法傳入參數時,我們可以給mydefault方法增加一個*args不定參數來兼容。

class

A

(object)

:


   

def

__init__

(self,a,b)

:


       self.a1 = a
       self.b1 = b
       

print

"init"


   

def

mydefault

(self,*args)

:


       

print

"default:"

+ str(args[

0

])
   

def

__getattr__

(self,name)

:


       

print

"other fn:"

,name
       

return

self.mydefault

a1 = A(

10

,

20

)
a1.fn1(

33

)
a1.fn2(

"hello"

)
a1.fn3(

10

)


8、包管理


一個包里有三個模塊,mod1.py, mod2.py, mod3.py,但使用from demopack import *導入模塊時,如何保證只有mod1、mod3被導入了。


答案:增加init.py文件,並在文件中增加:

__all__ = [

"mod1"

,

"mod3"

]


9、閉包


寫一個函數,接收整數參數n,返回一個函數,函數的功能是把函數的參數和n相乘並把結果返回。


答案:

def

mulby

(num)

:


   

def

gn

(val)

:


       

return

num * val

   

return

gn

zw = mulby(

7

)
print(zw(

9

));


10、性能


解析下面的代碼慢在哪

def

strtest1

(num)

:


   str=

"first"


   

for

i

in

range(num):
       str+=

"X"


   

return

str


答案:python的str是個不可變對象,每次迭代,都會生成新的str對象來存儲新的字元串,num越大,創建的str對象越多,內存消耗越大。


原文:http://www.bugcode.cn/PythonQuestions.html


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!

TAG: |