2017-07-18 114 views
3

我注意到,这种结构创建功能

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] 

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

回答

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] 
+1

啊确定。这是我在lambda表达式中的'function_maker'吗? – innisfree

+1

@innisfree是的。尽管使用函数会更清洁。 –