我注意到这个结构
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]
我想知道这是不是一个好主意。在更复杂的情况下,它能否隐藏更多令人讨厌的惊喜?
答案 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]