【问题标题】:Why does "lambda x: x ()()()()" work?为什么“lambda x: x ()()()()” 有效?
【发布时间】:2016-12-23 09:52:12
【问题描述】:

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

我的代码是:

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

【问题讨论】:

  • 只有调用 lambda才会出错。
  • 因为那是完全有效的 Python。例如,如果您传递了 class X: def __call__(self, *args, **kwargs): return self 并且 dfdf 在范围内,它可能会起作用。
  • &lt;function &lt;lambda&gt; at... 应该是一个线索,表明您从中得到的只是一个尚未调用的函数。

标签: python lambda


【解决方案1】:

您的表达式没有语法错误。调用 lambda 时可能会出现运行时错误,具体取决于 x,但就目前而言,您生成了有效的 lambda 对象。

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

换句话说,您定义了以下函数:

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

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

这将取决于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 被限制为 just x,则需要使用括号来覆盖运算符优先级:

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

【讨论】:

    【解决方案2】:

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

    如果你用另一个值调用 lambda,你会得到一个错误。

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

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

    这会出错,因为您没有传递x

    但实际上是这样解析的

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

    【讨论】:

    • s/一个可以调用的函数/一个可调用的/g - 根据定义,一个函数是一个可调用的(显然 ),但并非所有的可调用都是函数;)
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-02-26
        • 2016-03-21
        • 1970-01-01
        • 1970-01-01
        • 2020-09-24
        • 2014-05-19
        • 1970-01-01
        相关资源
        最近更新 更多