【问题标题】:how to use for in a list with lambda?如何在带有 lambda 的列表中使用 for?
【发布时间】:2017-11-02 00:33:35
【问题描述】:

这是我的代码:

a_list = [lambda x: x**n for n in range(1, 5)]
for q in a_list:
    print(q(3))

我想列出 3 的 1 到 4 的幂,但结果是:

27
27
27
27

你能帮我解决它吗?非常感谢! (我使用python 3)

【问题讨论】:

  • 顺便说一句,完全避免 lambda 的有趣小滥用(尽管它阻止调用者使用他们自己的 __pow__ 定义传递自定义对象),由于根本不需要 Python 级代码而运行得更快:@ 987654325@

标签: python-3.x list loops for-loop lambda


【解决方案1】:

您希望将参数保留为 lambda 中的默认值:

[lambda x, *, n=n: x**n for n in range(1, 5)]

然后:

>>> for q in a:
    print(q(3))


3
9
27
81

使用functools 模块:

from functools import partial
[partial((lambda n, x: x**n), n) for n in range(1, 5)]

请注意,在部分中,变量的顺序被切换了,因为partial 传入了第一个参数。 (为清楚起见,在 lambda 周围添加了括号)。

【讨论】:

  • 由于这是 Python 3,[lambda x, n=n: x**n for n in range(1, 5)] 可以更安全地表示为[lambda x, *, n=n: x**n for n in range(1, 5)]*, 使 n 仅限关键字,因此如果给出第二个位置参数,则不能意外传递。
【解决方案2】:

Rassar 的答案很好!

另一种方法是使用functools.partial 来设置n

from functools import partial

a_list = [partial(lambda n, x: x**n, n) for n in range(1, 5)]
for q in a_list:
    print(q(3))

partial 仅采用部分参数(这里是 n)并将其应用于函数并返回一个新函数,其中 n 已设置。

请注意,为了做到这一点,我们需要将 n 作为 lambda 的第一个参数!

【讨论】:

    猜你喜欢
    • 2020-02-13
    • 2019-09-04
    • 2021-05-22
    • 1970-01-01
    • 2014-08-17
    • 1970-01-01
    • 2010-10-01
    • 1970-01-01
    相关资源
    最近更新 更多