生成斐波那契數列並取前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三種模型