亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用哪個更優選:lambda函數或嵌套函數('def')?

使用哪個更優選:lambda函數或嵌套函數('def')?

Helenr 2019-12-25 11:00:43
我主要使用lambda函數,但有時使用似乎提供相同行為的嵌套函數。這是一些瑣碎的示例,如果在另一個函數中找到它們,它們在功能上會做同樣的事情:Lambda函數>>> a = lambda x : 1 + x>>> a(5)6嵌套功能>>> def b(x): return 1 + x>>> b(5)6使用一個相對于另一個有優勢嗎?(性能?可讀性?局限性?一致性?等)
查看完整描述

3 回答

?
慕斯709654

TA貢獻1840條經驗 獲得超5個贊

如果需要將分配lambda給名稱,請改用a def。defs只是分配的語法糖,因此結果是相同的,并且它們更具靈活性和可讀性。

lambdas只能使用一次,丟棄沒有名稱的函數。

但是,這種用例很少見。您很少需要傳遞未命名的函數對象。

內建函數map()filter()需要函數對象,但是列表理解生成器表達式通常比那些函數更具可讀性,并且可以覆蓋所有用例,而無需使用lambda。

對于情況下,你真的需要一個小的函數對象,你應該使用operator模塊的功能,如operator.add代替lambda x, y: x + y

如果您仍然需要一些lambda未涵蓋的內容,則可以考慮編寫def,以提高可讀性。如果功能比operator模塊中的功能更復雜,則a def可能更好。

因此,現實世界中的好用lambda例非常少見。


查看完整回答
反對 回復 2019-12-25
?
精慕HU

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__。但是通常情況下,最好還是使用一個函數。


查看完整回答
反對 回復 2019-12-25
?
有只小跳蛙

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秒即可:)


查看完整回答
反對 回復 2019-12-25
  • 3 回答
  • 0 關注
  • 570 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號