1. 程式人生 > >python面試中被問的最多的10道題

python面試中被問的最多的10道題

ret 局部變量 r+ 方法 創建 什麽 沒有 生成 attr

1 性能: 解析下面代碼慢在哪裏
def strtest1(num):
str=‘first‘
for i in range(num):
str+="X"
return str
解析:python中str是一個不可變類型,每次叠代,都會生成一個新的str來儲存對象,當num特別大的時候,就會創建很多的str,所有對內存的占用也
會特別的大。

2 閉包:寫一個函數,接收整數參數n,返回一個函數,函數的功能是把函數的參數和n相乘並把結果返回
def func(n):
def func1(val):
return val * n
return func1

num = func(2)
print(num(3))


3 包管理:一個包裏有三個模塊,mod1.py, mod2.py, mod3.py,但使用from demopack import *導入模塊時,如何保證只有mod1、mod3被
導入了
增加__init__.py文件,文件內容為
all =[‘mod1‘, ‘mod3‘]

4 類:添加代碼
class A:

def __init__(self, a, b):
self.a1 = a
self.b1 = bdef mydefault(self):
print(‘default‘)

a1 = A(10, 20)
a1.fn1()
a1.fn2()
a1.fu3()
要求輸出:

default
default
default

修改後代碼如下:
class A:

def __init__(self, a, b):
self.a1 = a
self.b1 = b

def mydefault(self):
print(‘default‘)

def __getattr__(self, item):
return self.mydefault

a1 = A(10, 20)
a1.fn1()
a1.fn2()
a1.fu3()
方法__getattr__只有在調用沒有定義的方法時,才會調用它。

以下代碼給mydefault加上了參數:

class A:

def __init__(self, a, b):
self.a1 = a
self.b1 = b

def mydefault(self, *args):
print(‘default‘ + str(args[0]))

def __getattr__(self, item):
return self.mydefault

a1 = A(10, 20)
a1.fn1(10)
a1.fn2(‘hello‘)
a1.fu3(20)

5 交換變量:一行代碼交換變量
a, b = b, a

6 全局變量和局部變量:下面代碼輸了什麽
num = 9
def f1():
num = 20

def f2():
print(num)

f2()
f1()
f2()
答案:
9
9
修改代碼:
num = 9
def f1():
global num
num = 20

def f2():
print(num)

f2()
f1()
f2()
得到答案:
9
20

7 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‘}
{‘h‘, ‘r‘, ‘d‘}

8 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()
答案:
先修改上述代碼:
class B:
def fn(self):
print(‘B fn‘)

def __init__(self):
print(‘B init‘)

class A:
def fn(self):
print(‘A fn‘)

def __new__(cls, a):
print(‘New ‘, a)
if a > 10:
return super(A, cls).__new__(cls)
else:
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

9 方法對象:為了讓下面代碼運行,需要增加什麽
class A:
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)
答案:

class A:
def __init__(self, a, b):
self.__a = a
self.__b = b

def myprint(self):
print(‘a=‘, self.__a, ‘b=‘, self.__b)

def __call__(self, *args):
print(‘call:‘, args[0] + 20)

a1 = A(10, 20)
a1.myprint()
a1(80)

10 繼承:如何讓obj繼承A類的show方法
class A:
def show(self):
print(‘base show‘)

class B(A):
def show(self):
print(‘derived show‘)

obj = B()
obj.show()
答案:
class A:
def show(self):
print(‘base show‘)

class B(A):
def show(self):
print(‘derived show‘)

obj = B()
obj.__class__ = A
obj.show()

python面試中被問的最多的10道題