10道Python面试常见的问题
1.類繼承
有如下的一段代碼:
如何調用類A的show方法了。
方法如下:
obj.__class__ = A obj.show()__class__方法指向了類對象,只用給他賦值類型A,然后調用方法show,但是用完了記得修改回來。
2.方法對象
問題:為了讓下面這段代碼運行,需要增加哪些代碼?
class A(object):def __init__(self,a,b):self.__a = aself.__b = bdef myprint(self):print 'a=', self.__a, 'b=', self.__ba1=A(10,20) a1.myprint()a1(80)答案:為了能讓對象實例能被直接調用,需要實現__call__方法
class A(object):def __init__(self, a, b):self.__a = aself.__b = bdef myprint(self):print 'a=', self.__a, 'b=', self.__bdef __call__(self, num):print 'call:', num + self.__a3.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", aif a>10:return super(A, cls).__new__(cls)return B()def __init__(self,a):print "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 i in ls if i>2] print list1list2 = [i*2 for i in ls if i>2] print list2dic1 = {x: x**2 for x in (2, 4, 6)} print dic1dic2 = {x: 'item' + str(x**2) for x in (2, 4, 6)} print dic2set1 = {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 = 9def f1():num = 20def f2():print numf2() f1() f2()答案:
9 9num不是個全局變量,所以每個函數都得到了自己的num拷貝,如果你想修改num,則必須用global關鍵字聲明。比如下面這樣
num = 9def f1():global numnum = 20def f2():print numf2() f1() f2()# prints: # 9 # 206.交換兩個變量的值
一行代碼交換兩個變量值
a=8 b=9答案:
(a,b) = (b,a)7.默認方法
如下的代碼
class A(object):def __init__(self,a,b):self.a1 = aself.b1 = bprint '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 = aself.b1 = bprint 'init'def mydefault(self):print '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 = aself.b1 = bprint 'init'def mydefault(self,*args):print 'default:' + str(args[0])def __getattr__(self,name):print "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 * valreturn gnzw = 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對象越多,內存消耗越大。
總結
以上是生活随笔為你收集整理的10道Python面试常见的问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python中Dict与OrderedD
- 下一篇: Python中for else注意事项