0

我正在编写一个示例来帮助我学习如何在 Python 中使用一流的函数。总的来说,我对我提出的解决方案感到满意,除了一行代码对我来说是“un-Pythonic”。

所以我正在处理的问题在这里定义。该谜题寻求六个简单函数的单一排列(在 720 种可能中),其中涉及最终返回 -3 的“2”。

这是我的解决方案,它简单地转储了所有可能的六函数排列及其结果。

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)

对我来说似乎不正确的行是带有嵌套perform调用的行: k = perform(...perform(...(. 我需要做的是将排列元组中的第一个函数应用到 0,然后将该函数的结果应用到元组中的第二个函数,依此类推,直到我想出应用组件函数的最终结果.

有没有一种更简洁的方法可以将函数依次应用于perm相应的结果,从 0 作为参数开始?我玩过map递归,但我无法找到比上述更优雅的解决方案。

4

1 回答 1

5

为什么不简单:

x = init value
for f in funclist:
    x = f(x)

或者更花哨的方式:

value = reduce(lambda x, f: f(x), funclist, init_value)
于 2012-08-22T15:58:10.707 回答