2016-12-23 46 views
-4

我在lambda之後放了幾個(),Python似乎忽略它們而不是拋出錯誤。爲什麼?爲什麼「lambda x:x()()()()」工作?

我的代碼是:

>>> lambda x: x()()()() 
<function <lambda> at 0x105ca7ed8> 
>>> lambda x: x (1)(2)(dfdf)() 
<function <lambda> at 0x105cae578> 
+1

這隻會是一個錯誤,如果你打電話給lambda。 –

+0

因爲這是完全有效的Python。例如,如果你傳遞了'class X:def __call __(self,* args,** kwargs):return self'和'dfdf',它就可以工作。 – jonrsharpe

+0

'...函數 ...應該是一條線索,你所得到的是一個函數,它還沒有被調用。 – TigerhawkT3

回答

2

你的表達有沒有語法錯誤。當您調用lambda時,可能會出現運行時錯誤,具體取決於x,但現在您生成了有效的lambda對象。

請記住lambdalowest operator precedence,因此它後面的所有表達式都是您調用它時要執行的lambda表達式的一部分。

換句話說,你定義了以下功能:

def lambda1(x): 
    return x()()()() 

def lambda2(x): 
    return x (1)(2)(dfdf)() 

,它會依靠什麼x會發生什麼。通過在接受任何參數,返回本身仍然不會有問題的功能:如果你所期望的拉姆達侷限於只是x,你需要使用括號來

>>> def returns_self(*args, **kwargs): 
...  print(args, kwargs) 
...  return returns_self 
... 
>>> lambda1 = lambda x: x()()()() 
>>> lambda1(returns_self) 
() {} 
() {} 
() {} 
() {} 
<function returns_self at 0x102938bf8> 

重載運算符優先級:

>>> (lambda x: x)() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: <lambda>() missing 1 required positional argument: 'x' 
0

Python是動態類型的,因此假設你知道你;再這樣做,當你定義的功能。所以如果你的論證x是返回函數的函數等,它將工作得很好。所以,這裏沒有錯誤。

1

這很好。你的lambda是一個函數,它的參數需要一個可以調用的函數,它返回一個可以調用的函數,它返回一個可以調用的函數,它返回一個可以調用的函數。最後一次調用的結果由lambda返回。

如果您使用另一個值調用lambda,則會發生錯誤。

也許你的困惑是因爲你認爲這意味着

(lambda x: x)()()()() 

哪位能給一個錯誤,因爲你沒有通過一個x

但它實際上解析像

lambda x: (x()()()()) 
+0

s /一個可以調用的函數/ a callable/g - 函數根據定義可調用(顯然爲),但不是所有的可調用函數都是函數;) –

-1

因爲x()()()是一個合法的表達式。