用python编写函数

发布于 2021-01-29 19:36:34

我有一个函数数组,我试图产生一个由数组中元素组成的函数。我的方法是:

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

此方法似乎无效,将不胜感激。

(我要反转列表,因为这是我希望函数成为的组合顺序)

关注者
0
被浏览
229
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

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

    作为快速解决方案,您可以将分配替换为:

    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,甚至更糟的是,指向相同的变量。final



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看