【问题标题】:How do you create a python list comprehension of lambdas? [duplicate]如何创建 lambda 的 python 列表理解? [复制]
【发布时间】:2020-11-03 03:22:11
【问题描述】:

我正在尝试使用列表推导创建延迟执行的 lambda 列表。 下面是一个简单的例子。

def func_a(message: str) -> None:
    print('a: ' + message)
    
def func_b(message: str) -> None:
    print('b: ' + message)

msg = 'some message'
funcs = [func_a, func_b]
funcs_w_args = [lambda : func(msg) for func in funcs]

for func in funcs_w_args:
    func()

结果是

b: some message
b: some message

而期望的结果应该是

a: some message
b: some message

我哪里错了?

【问题讨论】:

  • (希望可以作为评论)我认为您遇到了名称冲突问题 - lambda 表示“查找函数 'func' 并运行它”。在列表理解之后,名称“func”-> func_b。基本上, func 在您实际运行 lambda 之前不会关闭,因此它没有提供您所期望的。我无法证明这一点(我认为 func 在理解后会有一个值,但它没有)但我敢打赌它是沿着这些思路。
  • (实际上,这正是@Carcigenicate 的链接问题所显示的内容,所以去那里寻找更好的例子:)
  • @Carcigenicate。感谢您的链接。它提供了对该主题的彻底讨论。如需快速直接的答案,我建议使用 CypherX。

标签: python lambda list-comprehension deferred-execution


【解决方案1】:

解决方案

您想要实现的是定义partial 函数(更一般地)。您可以使用functools.partial 来执行此操作。

方法如下:

from functools import partial

# Your Code
def func_a(message: str) -> None:
    print('a: ' + message)
    
def func_b(message: str) -> None:
    print('b: ' + message)

msg = 'some message'
funcs = [func_a, func_b]

# What I changed: a list of partially-defined functions
funcs_w_args = [partial(func, msg) for func in funcs]

# Now call partially defined functions
for func in funcs_w_args:
    func()

输出

a: some message
b: some message

参考文献

【讨论】:

  • 虽然我认为这个问题是重复的,但我感谢您在此处放置 functools.partial 解决方案。 functools.partial 是完成任务的理想选择,但得不到足够的爱。滥用默认参数的传统习语就是这样 - 滥用,并且只被认为是传统的习语。不幸的是,这些习语有很多的惯性(另请参阅:x[:] 用于x.copy() 合适的地方)。
猜你喜欢
  • 1970-01-01
  • 2010-10-01
  • 2018-02-06
  • 2015-03-31
  • 2023-01-02
  • 2019-11-12
  • 1970-01-01
  • 2012-02-03
相关资源
最近更新 更多