Python最常見的10道面試題及答案

pythontab發表於2017-12-28

生成斐波那契數列並取前10項

def func(m):
  n,a,b = 0,1,1
  while n < m:
    yield a
    a,b = b,a+b
    n += 1
for one in func(10):
  print one

這個可以說是一道常見的簡單演算法題了,關鍵點就是理解a,b=b,a+b以及yield的作用。

擴充套件一個列表,列表中的元素可能也包含列表

def myextend(alist):
    tmp = []
    for one in alist:
        if isinstance(one,list):
            tmp.extend(myextend(one))
        else:
            tmp.append(one)
    return tmp
t = [1,2,5,[3,[],5,2,[57]],90]
print t
print myextend(t)

考察遞迴呼叫的思想。

有如下程式碼,請寫出輸出

def test(x,l=[]):
    for o in range(x):
        l.append(o)
    print l
test(3)
test(1,[3,2,1])
test(3)

輸出如下:

[0,1,2]
[3,2,1,0]
[0,1,2,0,1,2]

可變型別作為引數在不顯示傳遞引數時,每次函式呼叫時候都是共用的;如果傳遞了引數(比如第二種)則不會互相影響。

已知某列表中包含重複資料,保持列表中元素第一次出現的順序並去重,要求複雜度為O(n)。

def fun(alist):
    result = []
    temp = set()
    for o in alist:
        if o not in temp:
            result.append(o)
            temp.add(o)
    return result

考察列表、集合等常見操作的複雜度。

已知如下函式,請寫出輸出,並寫出正確寫法:

z = [lambda x:x*i for i in range(3)]
x = [o(2) for o in z]
print x

輸出為

[4,4,4]

這裡主要考察python中閉包、返回值為函式時候的知識點。由於lambda函式共用了i變數,當呼叫時候i已經變成了2,所以輸出都是4。

改正:

def func():
    def m(x):
        def n(y):
            return x * y
        return n
    return [f(one) for one in range(3)]
z = func()
x = [o(2) for o in z]
print x

輸出

[0,2,4]

建立一個類,並輸出某個屬性。如果這個屬性存在則輸出值,否則輸出這個屬性名的字串

class Mycls(object):
    a = 0
    def __getattr__(self,name):
        print name
z = Mycls()
print z.a,z.b

輸出為

0, b

主要考察python的反射機制,以及類相關的__getattr__方法。

注意__getattr__方法和__getattribute__方法的區別,前者只有在屬性不存在時候呼叫,返回一個值或者引發異常。而後者是每次都會被呼叫的。

另外可以看看getattr(),hasattr()這種內建函式。

簡答題

簡述py2和py3的區別

python的垃圾回收機制

python中多執行緒的方法,侷限,以及有什麼其他方式進行併發處理

簡述epoll、select、poll三種模型


相關文章