2009-10-18 29 views

回答

32

LAMBDA,它源於Lambda Calculus和(據我所知)最早是在Lisp實施,基本上是一個匿名函數 - 不具有名稱的功能,以及在線使用,換句話說,你可以指定一個標識符lambda函數在一個表達式爲這樣:

>>> addTwo = lambda x: x+2 
>>> addTwo(2) 
4 

此分配addTwo匿名功能,它接受1參數x,並且在函數體它增加了2至x,它返回的最後一個值函數體中的最後一個表達式,因此沒有return關鍵字。除非你不使用一個函數定義,你將標識符分配給拉姆達

>>> def addTwo(x): 
...  return x+2 
... 
>>> addTwo(2) 
4 

上面的代碼是大致相當於。

使用它們的最好的地方是當你不想用名字定義函數時,可能是因爲該函數只能用於一個時間而不是多次,在這種情況下你會更好關閉一個函數定義。

使用哈希樹的例子lambda表達式:

>>> mapTree = { 
...  'number': lambda x: x**x, 
...  'string': lambda x: x[1:] 
... } 
>>> otype = 'number' 
>>> mapTree[otype](2) 
4 
>>> otype = 'string' 
>>> mapTree[otype]('foo') 
'oo' 

在這個例子中,我真的不希望定義一個名字要麼這些功能,因爲我只哈希中使用過的,所以我會使用lambda表達式。

+0

只是一個很小的小挑逗,否則很好的答案:lambda不是原始的Lisp,而是來自lambda微積分。 – phoebus 2009-10-18 01:01:21

+0

啊是的,我的使用起源錯誤 - 我做了一些編輯。還有什麼我應該添加/修改? – 2009-10-18 01:05:11

+0

+1精彩的回答,考慮在字典例子中改變'type'的名字..因爲它是一個內建的... – 2009-10-18 05:37:15

3

我不知道你正在使用哪本書,但Dive into Python has a section,我認爲這是信息。

+0

2017年,萬維網上的任何地方都沒有diveintopython.org網站! – Rexford 2017-06-25 18:57:28

3

使用lambda是一種風格的事情。當你可以使用一個非常簡單的函數,並且通常將它存儲在某個地方(可能在函數列表中,或者在GUI工具包數據結構等中)時,人們會覺得lambda減少了代碼中的混亂。

在Python中,只能創建一個返回單個表達式的lambda表達式,並且lambda表達式不能跨越多行(除非通過使用反斜槓結束行來連接多行)招)。人們已經要求Python爲lambda添加改進,但並未發生。據我瞭解,使lambda能夠編寫任何函數的變化會使Python中的解析代碼顯着複雜化。而且,由於我們已經有了def來定義一個函數,所以增益並不值得複雜化。所以有些情況下你可能希望在不可能的地方使用lambda。在這種情況下,你可以使用一個def

object1.register_callback_function(lambda x: x.foo() > 3) 

def fn(x): 
    if x.foo() > 3: 
     x.recalibrate() 
     return x.value() > 9 
    elif x.bar() > 3: 
     x.do_something_else() 
     return x.other_value < 0 
    else: 
     x.whatever() 
     return True 

object2.register_callback_function(fn) 
del(fn) 

第一個回調函數是簡單和拉姆達足夠了。對於第二個,它根本不可能使用lambda。我們通過使用def並創建一個與名稱fn綁定的函數對象,然後將fn傳遞到register_callback_function()來實現相同的效果。然後,爲了顯示我們可以,我們將名稱fn上的del()解除綁定。現在名稱fn不再與任何對象綁定,但register_callback_function()仍然具有對函數對象的引用,因此函數對象位於其上。

相關問題