在列表中创建函数

时间:2017-07-18 02:47:24

标签: python lambda binding

我注意到这个结构

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

未能产生预期的结果,例如

[f(0.5) for f in funcs]
# [0.0625, 0.0625, 0.0625, 0.0625, 0.0625]

这个问题的规范解决方案是什么?我有自己的解决方法,就是这种模式

def function_maker(n):
    return lambda x: x**n

funcs = [function_maker(n) for n in range(5)]
[f(0.5) for f in funcs]
# [1.0, 0.5, 0.25, 0.125, 0.0625]

我想知道这是不是一个好主意。在更复杂的情况下,它能否隐藏更多令人讨厌的惊喜?

1 个答案:

答案 0 :(得分:4)

这是非常规范的,因为您需要在n上创建一个闭包以保留该值 你可以把它做成一个班轮,但它很难看:

>>> funcs = [(lambda e: lambda x: x**e)(n) for n in range(5)]
>>> [f(0.5) for f in funcs]
[1.0, 0.5, 0.25, 0.125, 0.0625]