2012-10-07 45 views
2
>>> def itself_and_plusone(x): 
...  return x, x+1 
... 
>>> itself_and_plusone(1) 
(1, 2) 

>>> (lambda x: x,x+1)(10) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'x' is not defined 

爲什麼?和解決lambda?不lambda不能有2+返回值?

>>> (lambda x: (x,x+1))(10) 
(10, 11) 

,因爲它返回一個元組(或列表..)和拆包元組將需要

回答

12

沒有它被解釋爲括號如下:

((lambda x: x),x+1)(10) 

失敗的原因第二個x在lambda表達式之外。即使定義了x,它仍然會失敗,因爲不能像使用元組一樣使用元組。

這個簡單的變化示出了正在發生的事情:

>>> x=42 
>>> (lambda x: x,x+1) 
(<function <lambda> at 0x00000000022B2648>, 43) 

注意,43是因爲在外部範圍的x使用,而不是在lambda函數的x

編寫它的正確方法是lambda x: (x,x+1)。這確實,正如你指出,返回一個元組,但這樣做你原來的功能:

>>> type(itself_and_plusone(10)) 
<class 'tuple'> 
1

在你的第一個例子中,元組是隱式的;當python在表達式中看到逗號時,python想象你的括號;從函數返回時,它這樣做的任何表達,不只是:

>>> 10, 10 
(10, 10) 

但在你的拉姆達例如,你必須讓他們明確的,因爲Python看到整個表達式作爲一個新的元組(含Lambda和一個x + 1表達式):

>>> (lambda x: x, 10) 
(<function <lambda> at 0x10f331b90>, 10) 
>>> lambda x: x, 10 
(<function <lambda> at 0x10f331aa0>, 10) 
>>> lambda x: (10, 10) 
<function <lambda> at 0x10f314ed8>