为什么" lambda x:x()()()()"工作?

时间:2016-12-23 09:52:12

标签: python lambda

我在()之后添加了几个lambda,Python似乎忽略了它们而不是抛出错误。为什么呢?

我的代码是:

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

4 个答案:

答案 0 :(得分:2)

您的表达式没有语法错误。调用lambda时可能存在运行时错误,具体取决于// do something with all `.foo` following `.visible` // todo (see following rule): we only want it for the first one .box.visible ~ .box.foo { // something } // override for the second, third, etc ones .box.foo ~ .box.foo { // do the opposite of "something" or reset to initial styles } ,但就目前而言,您生成了有效的x个对象。

请记住lambdalowest operator precedence,所以它之后的所有表达式都是你调用它时要执行的lambda表达式的一部分。

换句话说,您定义了以下功能:

lambda

它将取决于 def lambda1(x): return x ()()()() def lambda2(x): return x (1)(2)(dfdf)() 将会发生什么。传递一个接受任何参数并返回自身的函数,但仍然没有问题:

x

如果您希望lambda仅限于 >>> def returns_self(*args, **kwargs): ... print(args, kwargs) ... return returns_self ... >>> lambda1 = lambda x: x ()()()() >>> lambda1(returns_self) () {} () {} () {} () {} <function returns_self at 0x102938bf8> ,则需要使用括号来覆盖运算符优先级:

x

答案 1 :(得分:1)

这很好。你的lambda是一个函数,它需要一个可以被调用的函数作为它的参数,它返回一个可以被调用的函数,它返回一个可以被调用的函数,它返回一个可以被调用的函数。最后一次调用的结果由lambda返回。

如果用另一个值调用lambda,则会出错。

也许你的困惑是因为你认为这意味着

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

哪会出错,因为你没有传递x

但它实际上被解析为

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

答案 2 :(得分:0)

Python是动态类型的,所以它假定你知道你在定义函数时要做什么。因此,如果参数x是返回返回函数等的函数的函数,它将正常工作。所以,这里没有错误。

答案 3 :(得分:-1)

因为x ()()()是合法的表达方式。