Python允許用lambda關(guān)鍵字創(chuàng)造匿名函數(shù)燃乍。匿名是因為不需要以標(biāo)準(zhǔn)的方式來聲明柏副。然而,作為函數(shù)道川,它們也能有參數(shù)午衰。一個完整的lambda“語句”代表了一個表達式,這個表達式的定義體必須和聲明放在同一行冒萄。
用合適的表達式調(diào)用一個lambda生成一個可以像其他函數(shù)一樣使用的函數(shù)對象臊岸。它們可被傳給其他函數(shù),用額外的引用別名化尊流,作為容器對象以及作為可調(diào)用的對象被調(diào)用帅戒。當(dāng)被調(diào)用的時候,如果給定相同的參數(shù)的話崖技,這些對象會生成一個和相同表達式等價的結(jié)果逻住。它們和那些返回等價表達式計算值相同的函數(shù)是不能區(qū)分的。
def add2(x,y=2):return x+y 等價于 lambda x,y=2:x+y
除了lambda表達式之外迎献,python還支持將函數(shù)作為參數(shù)傳遞給另外一個函數(shù).python語言內(nèi)建的函數(shù)apply,filter,map,reduce就可以接受函數(shù)參數(shù)瞎访。
apply函數(shù)逐步被淘汰,不做介紹吁恍。
filter(function, sequence)會遍歷sequence中的每一個item,并以該item為參數(shù)調(diào)用function,如果function返回ture,就將該item加到結(jié)果sequence中扒秸,這就達到過濾sequence的效果,作為參數(shù)的function就是過濾的條件冀瓦,舉例:
>>> a=range(1,10)
>>> filter(lambda(n):n%2==0,a)
[2, 4, 6, 8]
map(function, sequence)也是遍歷sequence中的每一個item,并以該item為參數(shù)調(diào)用function伴奥,然后將執(zhí)行結(jié)果添加到最終的結(jié)果sequence中,舉例:
>>> b=range(1,10)
>>> map(lambda(n):n**2,b)
[1, 4, 9, 16, 25, 36, 49, 64, 81]
reduce(function, sequence)先把sequence中的頭兩個item作為參數(shù)傳給function,將function的運行結(jié)果跟第三個item作為參數(shù)再次傳給function翼闽,直至遍歷完sequence,最后把單個值返回渔伯,舉例:
>>> def add(x,y):
return x+y
>>> reduce(add,range(1,10))
45