我們在會碰到各種各樣的面試,有的甚至是HR專門為你設定的障礙,在python面試中也是,無論你是應聘Python web開發,爬蟲工程師,或是資料分析,還是自動化營運,這些python面試基礎題十大陷阱也許你會遇到,今天的python培訓總結出來給你以防萬一,收好不謝!
問題1:請問如何修改以下Python代碼,使得下面的代碼調用類A的show方法?
- class A(object)
-
- def show(self):
-
- print 'derived show'
-
- class B(A)
-
- def show(self):
-
- print 'derived show'
-
- obj=B()
-
- obj.show()
複製代碼
答:這道題的考點是類繼承,只要通過__class__ 方法指定類對象就可以了。補充的代碼如下:
- obj._class_=A
-
- obj.show()
複製代碼
問題2:請問如何修改以下Python代碼,使得代碼能夠運行?
- 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:下面這段代碼的輸出是什麼?
- 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的用法,使用 __new__ 方法,可以決定返回那個對象,也就是建立對象之前調用的,這個常見于于設計模式的單例、原廠模式。__init__ 是建立對象是調用的。
問題4:下面這段代碼輸出什麼?
- 1s=[1,2,3,4]
-
- list1 =[i for i in ls if i>2
-
- print list1
-
- list2 =[1*2 for i in ls if 1>2
-
- print list2
-
- dicl={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
-
- setl ={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():
-
- um=20
-
- def f2():
-
- print num
-
- f2()
-
- f1()
-
- f2()
複製代碼
答:
- 9
-
- 9
複製代碼
此題考察全域變數和局部變數。num 不是個全域變數,所以每個函數都得到了自己的 num 拷貝,如果你想修改 num ,則必須用 global 關鍵字聲明。比如下面這樣
- num=9
-
- def f1():
-
- global num
-
- um=20
-
- def f2():
-
- print num
-
- f2()
-
- f1()
-
- f2()
-
- #prints:
-
- #9
-
- #20
複製代碼
問題6:如何使用一行代碼交換兩個變數值?
- a=8
-
- b=9
複製代碼
答:
- (a,b)=(b,a)
複製代碼
問題7:如何添加代碼,使得沒有定義的方法都調用mydefault方法?
- 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()
複製代碼
答:
- 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()
複製代碼
此題的考的是Python的預設方法, 只有當沒有定義的方法調用時,才會調用方法 __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:請問下面的代碼有什麼隱患?(Python2中)
- def strtest1(num):
-
- str='first'
-
- for i in range(num):
-
- str+="X"
-
- return str
複製代碼
答:由於變數str是個不可變對象,每次迭代,python都會產生新的str對象來儲存新的字串,num越大,建立的str對象越多,記憶體消耗越大。
126 次點擊