1. 程式人生 > >Python面試常問的10個問題

Python面試常問的10個問題


10個Python面試常問的問題

概述

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

1、類繼承

有如下的一段程式碼:

  1. class A(object): 
  2.     def show(self): 
  3.         print 'base show'
  4. class B(A): 
  5.     def show(self): 
  6.         print 'derived show'
  7. obj = B() 
  8. obj.show() 

如何呼叫類A的show方法了。

方法如下:

  1. obj.__class__ = Aobj.show() 

__class__方法指向了類物件,只用給他賦值型別A,然後呼叫方法show,但是用完了記得修改回來。

2、方法物件

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

  1. class A(object): 
  2.     def __init__(self,a,b): 
  3.         self.__a = a 
  4.         self.__b = b 
  5.     def myprint(self): 
  6.         print 'a=', self.__a, 'b=', self.__b 
  7. a1=A(10,20) 
  8. a1.myprint() 
  9. a1(80) 

答案:為了能讓物件例項能被直接呼叫,需要實現__call__方法

  1. class A(object): 
  2.     def __init__(self, a, b): 
  3.         self.__a = a 
  4.         self.__b = b 
  5.     def myprint(self): 
  6.         print 'a=', self.__a, 'b=', self.__b 
  7.     def __call__(self, num): 
  8.         print 'call:', num + self.__a 

3、new和init

下面這段程式碼輸出什麼?

  1. class B(object): 
  2.     def fn(self): 
  3.         print 'B fn'
  4.     def __init__(self): 
  5.         print "B INIT"
  6. class A(object): 
  7.     def fn(self): 
  8.         print 'A fn'
  9.     def __new__(cls,a): 
  10.             print "NEW", a 
  11.             if a>10: 
  12.                 return super(A, cls).__new__(cls) 
  13.             return B() 
  14.     def __init__(self,a): 
  15.         print "INIT", a 
  16. a1 = A(5) 
  17. a1.fn() 
  18. a2=A(20) 
  19. a2.fn() 

答案:

  1. NEW 5 
  2. B INIT 
  3. B fn 
  4. NEW 20 
  5. INIT 20 
  6. A fn 

使用__new__方法,可以決定返回那個物件,也就是建立物件之前,這個可以用於設計模式的單例、工廠模式。__init__是建立物件是呼叫的。

4、Python list和dict生成

下面這段程式碼輸出什麼?

  1. ls = [1,2,3,4] 
  2. list1 = [i for i in ls if i>2] 
  3. print list1 
  4. list2 = [i*2 for i in ls if i>2] 
  5. print list2 
  6. dic1 = {x: x**2 for x in (2, 4, 6)} 
  7. print dic1 
  8. dic2 = {x: 'item' + str(x**2) for x in (2, 4, 6)} 
  9. print dic2 
  10. set1 = {x for x in'hello world' if x notin'low level'
  11. print set1 

答案:

  1. [3, 4]   
  2. [6, 8] 
  3. {2: 4, 4: 16, 6: 36} 
  4. {2: 'item4', 4: 'item16', 6: 'item36'
  5. set(['h''r''d']) 

5、全域性和區域性變數

下面這段程式碼輸出什麼?

  1. num = 9 
  2. def f1(): 
  3.     num = 20 
  4. def f2(): 
  5.     print num 
  6. f2() 
  7. f1() 
  8. f2() 

答案:

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

  1. num = 9 
  2. def f1(): 
  3.     global num 
  4.     num = 20 
  5. def f2(): 
  6.    print num 
  7. f2() 
  8. f1() 
  9. f2() 
  10. # prints: 
  11. #      9 
  12. #      20 

6、交換兩個變數的值

一行程式碼交換兩個變數值

  1. a=8 
  2. b=9 

答案:

  1. (a,b) = (b,a) 

7、預設方法

如下的程式碼

  1. class A(object): 
  2.     def __init__(self,a,b): 
  3.         self.a1 = a 
  4.         self.b1 = b 
  5.         print 'init'
  6.     def mydefault(self): 
  7.         print 'default'
  8. a1 = A(10,20) 
  9. a1.fn1() 
  10. a1.fn2() 
  11. a1.fn3() 

方法 fn1/fn2/fn3 都沒有定義,新增程式碼,是沒有定義的方法都呼叫mydefault函式,上面的程式碼應該輸出

  1. defaultdefaultdefault 

答案:

  1. class A(object):
  2.     def __init__(self,a,b): 
  3.         self.a1 = a 
  4.         self.b1 = b 
  5.         print 'init'
  6.     def mydefault(self): 
  7.         print 'default'
  8.     def __getattr__(self,name): 
  9.         return self.mydefault 
  10. a1 = A(10,20) 
  11. a1.fn1() 
  12. a1.fn2() 
  13. a1.fn3() 

方法__getattr__只有當沒有定義的方法呼叫時,才是呼叫他。當fn1方法傳入引數時,我們可以給mydefault方法增加一個*args不定引數來相容。

  1. class A(object): 
  2.     def __init__(self,a,b): 
  3.         self.a1 = a 
  4.         self.b1 = b 
  5.         print 'init'
  6.     def mydefault(self,*args): 
  7.         print 'default:' + str(args[0]) 
  8.     def __getattr__(self,name): 
  9.         print "other fn:",name
  10.         return self.mydefault 
  11. a1 = A(10,20) 
  12. a1.fn1(33) 
  13. a1.fn2('hello'
  14. a1.fn3(10) 

8、包管理

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

答案:增加__init__.py檔案,並在檔案中增加:

  1. __all__ = ['mod1','mod3'

9、閉包

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

答案:

  1. def mulby(num): 
  2.     def gn(val): 
  3.         return num * val 
  4.     return gn 
  5. zw = mulby(7) 
  6. print(zw(9)); 

10、效能

解析下面的程式碼慢在哪

  1. def strtest1(num): 
  2.     str='first'
  3.     for i in range(num): 
  4.         str+="X"
  5.     return str 

答案:python的str是個不可變物件,每次迭代,都會生成新的str物件來儲存新的字串,num越大,建立的str物件越多,記憶體消耗越大。

【編輯推薦】