一直都是用def來創建函數的,最近又看到很多lambda來申明函數的,不知道這二者的用途有什么區別。def創建的函數是可以多次調用的,而lambda卻不可以,那么,為什么有時候要使用lambda呢?他創建的函數而且很難讀懂耶。
2 回答

Cats萌萌
TA貢獻1805條經驗 獲得超9個贊
lambda函數一般是在函數式編程中使用的。通常學習的C/C++/Java等等都是過程式編程,所以不常接觸lambda函數。
其實這貨在C++中已經有所運用了,如果對stl的迭代器比較熟悉的話,就會知道里頭的foreach等函數,需要給一個函數,這對于C/C++這種古老的語言來說比較痛苦,一般是在主函數外再寫一個函數,然后傳入函數指針,看起來非常不直觀。boosts用一些特殊的語法技巧實現了C++的lambda。
舉個栗子,對于這樣一個list L,求L中大于3的元素集合
L = [1, 2, 3, 4, 5]
對于過程式編程,通常會這么寫
L3 = []for i in L: if i > 3: L3.append(i)
而對于函數式變成,只需要給filter函數一個判斷函數就行了
def greater_than_3(x): return x > 3L3 = filter(greater_than_3, L)
由于這個判斷函數非常簡單,用def寫起來太累贅了,所以用lambda來實現就非常簡潔、易懂
L3 = filter(lambda x: x > 3, L)
這是個很簡單的例子,可以看出lambda的好處。lambda函數更常用在map和reduce兩個函數中。

牛魔王的故事
TA貢獻1830條經驗 獲得超3個贊
基本上lambda適用于一些臨時性的,小巧的函數。比如作為一些參數傳遞給其他函數(類似callback)
比如itertools模塊的ifilter函數
def ifilter(predicate, iterable): # ifilter(lambda x: x%2, range(10)) --> 1 3 5 7 9 if predicate is None: predicate = bool for x in iterable: if predicate(x): yield x
這里的predicate就可以傳遞一個lambda函數進去,如果專門為此用一個def來定義函數,顯得代碼不夠簡介小巧,而lambda正合此意
添加回答
舉報
0/150
提交
取消