匿名函式-lambda
阿新 • • 發佈:2018-11-11
匿名函式-lambda
匿名函式 lambda [arg1 [,arg2,.....argn]]:expression lambda只是一個表示式,函式體比def簡單很多。 lambda的主體是一個表示式,而不是一個程式碼塊。僅僅能在lambda表示式中封裝有限的邏輯進去。 lambda函式擁有自己的名稱空間,且不能訪問自有引數列表之外或全域性名稱空間裡的引數。 雖然lambda函式看起來只能寫一行,卻不等同於C或C++的行內函數,後者的目的是呼叫小函式時不佔用棧記憶體從而增加執行效率。 exp: dic = {'k1': 10, 'k2': 50, 'k3': 100, 'k4': 80} print(max(dic,key=lambda k:dic[k])) 內建函式中引數帶key的有以下: max min filter map sorted 以上都可以通過和lambda合用完成一些功能 exp2: 現有兩元組tup1,tup2,請使用匿名函式生產列表lst tup1 = (('a'),('b')) tup2 = (('c'),('d')) lst = [{'a':'c'},{'b':'d'}] 寫法1:自己寫的 lst = lambda x,y: [{(x[i][0]):y[i][0]} for i in range(len(x))] print(lst(tup1,tup2)) [{'a': 'c'}, {'b': 'd'}] 寫法2: tup1 = (('a'),('b')) tup2 = (('c'),('d')) # lst = [{'a':'c'},{'b':'d'}] # ret = zip(tup1,tup2) # def func(t): # return {t[0]:t[1]} # func = lambda t:{t[0]:t[1]} # res = map(lambda t:{t[0]:t[1]},zip(tup1,tup2)) print(list(map(lambda t:{t[0]:t[1]},zip(tup1,tup2)))) exp3.以下程式碼的輸出是什麼?請給出答案並解釋。 def multipliers(): return [lambda x:i*x for i in range(4)] print([m(2) for m in multipliers()]) 請修改multipliers的定義來產生期望的結果。 解析: def multipliers(): return [lambda x : i *x for i in range(4)] #返回列表推導式 [lambda x : i *x,lambda x : i *x,lambda x : i *x,lambda x : i *x] print([m(2) for m in multipliers()]) # [m(2) for m in [lambda x : i *x,lambda x : i *x,lambda x : i *x,lambda x : i *x]] # multipliersw()為[lambda x : i *x,lambda x : i *x,lambda x : i *x,lambda x : i *x] # [m(2) for m in [lambda x : i *x,lambda x : i *x,lambda x : i *x,lambda x : i *x]] # m 為 lambda x : i *m, 4次 # m(2) [lambda x : i *2,lambda x : i *2,lambda x : i *2,lambda x : i *2]] #而此時multipliers()中的for迴圈已執行完,i最後的值為3 # 所以 [lambda x : 3 *2,lambda x : 3 *2,lambda x : 3 *2,lambda x : 3 *2]] #[6, 6, 6, 6] exp4.以下程式碼的輸出是什麼?請給出答案並解釋。 def multipliers(): return (lambda x : i *x for i in range(4)) #返回一個生成器 g =(lambda x : i *x for i in range(4) print([m(2) for m in multipliers()]) # [m(2) for m in multipliers()] # [m(2) for m in (lambda x : i *x for i in range(4)] # [m(2) for m in (lambda x : 0 *x,lambda x : 1 *x,lambda x : 2 *x,lambda x : 3 *x] # [2 * 0,,2 * 1, 2 * 2,2 * 3] #[0,2,4,6]