3 回答

TA貢獻1840條經驗 獲得超5個贊
如果需要將分配lambda
給名稱,請改用a def
。def
s只是分配的語法糖,因此結果是相同的,并且它們更具靈活性和可讀性。
lambda
s只能使用一次,丟棄沒有名稱的函數。
但是,這種用例很少見。您很少需要傳遞未命名的函數對象。
內建函數map()
和filter()
需要函數對象,但是列表理解和生成器表達式通常比那些函數更具可讀性,并且可以覆蓋所有用例,而無需使用lambda。
對于情況下,你真的需要一個小的函數對象,你應該使用operator
模塊的功能,如operator.add
代替lambda x, y: x + y
如果您仍然需要一些lambda
未涵蓋的內容,則可以考慮編寫def
,以提高可讀性。如果功能比operator
模塊中的功能更復雜,則a def
可能更好。
因此,現實世界中的好用lambda
例非常少見。

TA貢獻1845條經驗 獲得超8個贊
實際上,對我來說有兩個區別:
首先是關于他們做什么以及他們返回什么:
def是不返回任何內容并在本地名稱空間中創建“名稱”的關鍵字。
lambda是一個關鍵字,它返回一個函數對象,并且不在本地名稱空間中創建“名稱”。
因此,如果需要調用帶有函數對象的函數,則在一行python代碼中執行此操作的唯一方法是使用lambda。def沒有等效功能。
在某些框架中,這實際上是很常見的。例如,我經常使用Twisted,
d.addCallback(lambda result: setattr(self, _someVariable, result))
是很常見的,并且對lambda更為簡潔。
第二點區別是允許實際執行的功能。
用'def'定義的函數可以包含任何python代碼
用“ lambda”定義的函數必須求值為表達式,因此不能包含諸如print,import,raise,...之類的語句。
例如,
def p(x): print x
如預期般運作
lambda x: print x
是一個SyntaxError。
當然,也有變通方法-代替print用sys.stdout.write,或import用__import__。但是通常情況下,最好還是使用一個函數。

TA貢獻1824條經驗 獲得超8個贊
Guido van Rossum 在這次采訪中說,他希望自己不要讓“ lambda”進入Python:
“ 問:您最不滿意Python的什么功能?
有時候我接受捐助太快了,后來才意識到這是一個錯誤。一個例子就是一些函數式編程功能,例如lambda函數。lambda是一個關鍵字,使您可以創建一個小的匿名函數;諸如map,filter和reduce的內置函數可以在序列類型(如列表)上運行該函數。
在實踐中,結果并非如此。Python只有兩個范圍:本地和全局。這使編寫lambda函數很痛苦,因為您經常想在定義了lambda的作用域中訪問變量,但由于這兩個作用域而不能。有辦法解決這個問題,但這有點不合時宜。通常,在Python中僅使用for循環而不是搞亂lambda函數似乎容易得多。只有當已有內置功能可以滿足您的需求時,地圖和朋友才能正常工作。
恕我直言,Iambdas有時可能很方便,但是通常以可讀性為代價很方便。你能告訴我這是怎么做的:
str(reduce(lambda x,y:x+y,map(lambda x:x**x,range(1,1001))))[-10:]
我寫了它,花了我一分鐘才弄清楚。這是來自歐拉計劃-我不會說哪個問題,因為我討厭劇透,但是它只需要0.124秒即可:)
添加回答
舉報