我在lambda
之後放了幾個()
,Python似乎忽略它們而不是拋出錯誤。爲什麼?爲什麼「lambda x:x()()()()」工作?
我的代碼是:
>>> lambda x: x()()()()
<function <lambda> at 0x105ca7ed8>
>>> lambda x: x (1)(2)(dfdf)()
<function <lambda> at 0x105cae578>
我在lambda
之後放了幾個()
,Python似乎忽略它們而不是拋出錯誤。爲什麼?爲什麼「lambda x:x()()()()」工作?
我的代碼是:
>>> lambda x: x()()()()
<function <lambda> at 0x105ca7ed8>
>>> lambda x: x (1)(2)(dfdf)()
<function <lambda> at 0x105cae578>
你的表達有沒有語法錯誤。當您調用lambda時,可能會出現運行時錯誤,具體取決於x
,但現在您生成了有效的lambda
對象。
請記住lambda
有lowest 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'
Python是動態類型的,因此假設你知道你;再這樣做,當你定義的功能。所以如果你的論證x
是返回函數的函數等,它將工作得很好。所以,這裏沒有錯誤。
這很好。你的lambda是一個函數,它的參數需要一個可以調用的函數,它返回一個可以調用的函數,它返回一個可以調用的函數,它返回一個可以調用的函數。最後一次調用的結果由lambda返回。
如果您使用另一個值調用lambda,則會發生錯誤。
也許你的困惑是因爲你認爲這意味着
(lambda x: x)()()()()
哪位能給一個錯誤,因爲你沒有通過一個x
。
但它實際上解析像
lambda x: (x()()()())
s /一個可以調用的函數/ a callable/g - 函數根據定義可調用(顯然爲
因爲x()()()
是一個合法的表達式。
這隻會是一個錯誤,如果你打電話給lambda。 –
因爲這是完全有效的Python。例如,如果你傳遞了'class X:def __call __(self,* args,** kwargs):return self'和'dfdf',它就可以工作。 – jonrsharpe
'...函數 ...應該是一條線索,你所得到的是一個函數,它還沒有被調用。 –
TigerhawkT3