10個Python常見面試題,這些弄不明白不要說學過Python!
源 /
網路
文
/
笨熊 編
/ AI時間
概述
Python是個非常受歡迎的編程語言,隨著近些年機器學習、雲計算等技術的發展,Python的職位需求越來越高。下面我收集了10個Python面試官經常問的問題,供大家參考學習。
1、類繼承
有如下的一段代碼:
class
A
(object)
:
def
show
(self)
:"base show"
class
B
(A)
:
def
show
(self)
:"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)
:
"a="
, self.__a,"b="
, self.__ba1=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)
:
"a="
, self.__a,"b="
, self.__bdef
__call__
(self, num)
:"call:"
, num + self.__a3、new和init
下面這段代碼輸入什麼?
class
B
(object)
:def
fn
(self)
:"B fn"
def
__init__
(self)
:"B INIT"
class
A
(object)
:def
fn
(self)
:"A fn"
def
__new__
(cls,a)
:"NEW"
, aif
a>10
:return
super(A, cls).__new__(cls)return
B()
def
__init__
(self,a)
:"INIT"
, aa1 = 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
iin
lsif
i>2
]print(list1)
list2 = [i*
2
for
iin
lsif
i>2
]print(list2)
dic1 = {x: x**
2
for
xin
(2
,4
,6
)}print(dic1)
dic2 = {x:
"item"
+ str(x**2
)for
xin
(2
,4
,6
)}print(dic2)
set1 = {x
for
xin
"hello world"
if
xnot
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
()
:f2()
f1()
f2()
答案:
9
9
num不是個全局變數,所以每個函數都得到了自己的num拷貝,如果你想修改num,則必須用global關鍵字聲明。比如下面這樣
num =
9
def
f1
()
:global
numnum =
20
def
f2
()
: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
"init"
def
mydefault
(self)
:"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
"init"
def
mydefault
(self)
:"default"
def
__getattr__
(self,name)
:return
self.mydefaulta1 = 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
"init"
def
mydefault
(self,*args)
:"default:"
+ str(args[0
])def
__getattr__
(self,name)
:"other fn:"
,namereturn
self.mydefaulta1 = 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
gnzw = mulby(
7
)print(zw(
9
));10、性能
解析下面的代碼慢在哪
def
strtest1
(num)
:str=
"first"
for
iin
range(num):str+=
"X"
return
str答案:python的str是個不可變對象,每次迭代,都會生成新的str對象來存儲新的字元串,num越大,創建的str對象越多,內存消耗越大。
原文:http://www.bugcode.cn/PythonQuestions.html