所以我写了一个函数f(a,b)。结构是:
def f(a, b):
global result
def g(a, b):
global result
return result
deg h(a):
return a # an updated a
g(a, b)
a = h(a)
g(a, b)
a = h(a)
g(a, b)
a = h(a)
g(a, b)
return result
g(a, b)
和h(a)
f(a, b)
。 g(a, b)
才能获得部分结果a
g(a, b)
来更新结果。 g(a, b)
的4次运行之后,我得到了完整的结果并返回了值。必须有一种方法来构建这里看起来更简单,更清晰的过程。
我也尝试过:
g(a, b)
g(h(a), b)
g(h(h(a), b)
g(h(h(h(a), b)
这看起来也很可怕。
我需要一些建议来简单地在这里构建,也许使用map()或其他高阶函数?但我无法理解。
谢谢!
答案 0 :(得分:2)
首先你应该使用参数和返回值,而不是副作用(即返回或修改全局变量)。我发现使用global result
会使你的代码无法读取,但我认为你是在询问动态函数组合,可以这样表达:
def compose(*fv):
return reduce(lambda f, g: lambda x: f(g(x)), fv)
然后像这样使用(注意评估顺序是从右到左,这很常见):
def add1(x): return x + 1
def mul2(x): return x * 2
>>> compose(add1, add1, add1)(1)
4
>>> compose(mul2, add1, add1, add1)(1)
8
这在函数式语言中很常见,但我发现当你想在python中使用这个模式时,你的工作就不够简单了。
答案 1 :(得分:1)
如果您想要做的是这样的话:
g(a, b)
a = h(a)
g(a, b)
a = h(a)
g(a, b)
a = h(a)
g(a, b)
你可以这样做:
for i in range(4):
g(a, b)
a = h(a)
g(a, b)
更紧凑