我正在编写一个示例来帮助我学习如何在 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
递归,但我无法找到比上述更优雅的解决方案。