Python First Class函数的后续应用:是否比嵌套更清洁?

Teb*_*bbe 0 python function-pointers

我正在做一个例子来帮助我学习如何在Python中使用第一类函数.总的来说,我对我提出的解决方案感到满意,除了一行代码尖叫"非Pythonic"给我.

所以我在这里定义我正在使用的问题.这个难题寻求六个简单函数的单个排列(720个可能),其中涉及"2"最终返回-3.

这是我的解决方案,它简单地转储每个可能的六功能排列及其结果.

def perform (fun, arg):
    return fun(arg)

def a(n):
    return n + 2

def d(n):
    return n / 2.

def m(n):
    return n * 2

def p(n):
    return n ** 2

def r(n):
    return n ** 0.5

def s(n):
    return n - 2

if __name__ == "__main__":
    from itertools import permutations

    for i, perm in enumerate(permutations([a, d, m, p, r, s])):
        try:
            k = perform(perm[5], perform(perm[4], perform(perm[3], perform(perm[2], perform(perm[1], perform(perm[0], 0))))))
        except ValueError:
            k = float('nan')

        print "%03d. %s: %8.8f" % (i + 1, ''.join([x.__name__ for x in perm]), k)
Run Code Online (Sandbox Code Playgroud)

对我来说似乎不对的行是嵌套perform调用的行: k = perform(...perform(...(.我需要做的是将置换元组中的第一个函数应用于0,然后将该函数的结果应用于元组中的第二个函数,依此类推通过置换元组直到我得出应用组件函数的最终结果.

是否有更简洁的方法将函数连续应用于perm相应的结果,从0开始作为参数?我玩弄map和递归,但我没有能够找到比上面更优雅的解决方案.

geo*_*org 5

为什么不简单:

x = init value
for f in funclist:
    x = f(x)
Run Code Online (Sandbox Code Playgroud)

或者以更有趣的方式:

value = reduce(lambda x, f: f(x), funclist, init_value)
Run Code Online (Sandbox Code Playgroud)

  • 他们都是迭代的 (2认同)