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和递归,但我没有能够找到比上面更优雅的解决方案.
为什么不简单:
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)