我在()
之后添加了几个lambda
,Python似乎忽略了它们而不是抛出错误。为什么呢?
我的代码是:
>>> lambda x: x ()()()()
<function <lambda> at 0x105ca7ed8>
>>> lambda x: x (1)(2)(dfdf)()
<function <lambda> at 0x105cae578>
答案 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
个对象。
请记住lambda
有lowest 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 ()()()
是合法的表达方式。