在python中编写函数

我有一个函数数组,我正在尝试生成一个函数,该函数由我的数组中的元素组成.
我的方法是:

def compose(list):
    if len(list) == 1:
        return lambda x:list[0](x)
    list.reverse()
    final=lambda x:x
    for f in list:
        final=lambda x:f(final(x))
    return final

这种方法似乎不起作用,将不胜感激.

(我正在颠倒列表,因为这是我想要函数的组合顺序)

解决方法:

它不起作用,因为您在循环中创建的所有匿名函数都引用相同的循环变量,因此共享其最终值.

作为快速修复,您可以将作业替换为:

final = lambda x, f=f, final=final: f(final(x))

或者,您可以从函数返回lambda:

def wrap(accum, f):
    return lambda x: f(accum(x))
...
final = wrap(final, f)

要了解发生了什么,请尝试以下实验:

>>> l = [lambda: n for n in xrange(10)]
>>> [f() for f in l]
[9, 9, 9, 9, 9, 9, 9, 9, 9, 9]

这个结果让许多人感到惊讶,他们期望结果是[0,1,2,…].但是,所有lambda都指向相同的n变量,并且都引用它的最终值,即9.在你的情况下,所有应该嵌套的final的版本最终都指向相同的f,更糟糕的是,到同一个决赛.

Python中lambdas和for循环的主题是already covered on SO.

上一篇:DOM Composition 事件


下一篇:c – 将类的属性泄露给它的组件