您可以在 lambda 中分配变量吗?

新手上路,请多包涵

我正在使用 lambda 语句来执行数学运算,并且碰巧重复使用了某个值。因此,我想知道是否可以在 lambda 语句中分配和使用变量。

我试过这样的事情:

 a = lambda n:(b=3+2*n) #[my math here]

然而,这只会引发错误,我想知道是否有办法做到这一点。

原文由 Professor_Joykill 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 392
2 个回答

不,你不能。 lambda 中只允许使用表达式:

>  lambda_expr        ::=  "lambda" [parameter_list]: expression
> lambda_expr_nocond ::=  "lambda" [parameter_list]: expression_nocond
>
> ```

但是,您可以在 --- _中_ 定义 _第二个_ `lambda` `lambda` 并立即使用您想要的参数调用它。 (这是否真的更好可能是另一个问题。)

a = lambda n: ((3+2n), n(3+2*n)) # for reference, with repetition a(42) (87, 3654) a2 = lambda n: (lambda b: (b, n*b))(3+2*n) # lambda inside lambda a2(42) (87, 3654) a3 = lambda n: (lambda b=3+2*n: (b, n*b))() # using default parameter a3(42) (87, 3654)


当然,外层和内层lambda都可以有不止一个参数,即你可以一次定义多个“变量”。这种方法的好处,例如,在第一个 _之外_ 定义第二个 lambda 是,您仍然可以使用原始参数(如果您调用 `a` 和 `b` pre -calculated) 并且你只需要为 `b` 计算一次(除了重复调用一个函数来计算 `b` 在 `a` 中)。

* * *

此外,受 [链接问题的最佳答案的](https://stackoverflow.com/a/14617232/1639625) 启发,您还可以将一个或多个变量定义为 lambda 中的列表理解或生成器的一部分,然后从中获取 `next` (第一个也是唯一的)结果该生成器或列表:

a4 = lambda n: next((b, n*b) for b in [3+2*n]) a4(42) (87, 3654)


但是,我认为 lambda-in-a-lambda 背后的意图更清楚一些。最后,请记住,除了单行 `lambda` ,您还可以使用更清晰的三行 `def` 语句...

* * *

此外,从 Python 3.8 开始,将有 [赋值表达式](https://www.python.org/dev/peps/pep-0572/),这 _应该_ 可以编写这样的东西。 (使用 Python 3.8.10 测试。)

a5 = lambda n: ((b := 3+2*n), n*b)

”`

原文由 tobias_k 发布,翻译遵循 CC BY-SA 4.0 许可协议

如果您愿意,您可以将 lambda 参数传递给另一个参数:

 >>> b = lambda x: 3 + 2*x
>>> a = lambda y: y * b(y)
>>> a(1)
5
>>> a(2)
14

原文由 Zoidberg 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题