http://pythonprogramming.jottit.com/functional_programming 有教程它给出了一个如何使用高阶函数返回函数的例子:
def trace(f):
f.indent = 0
def g(x):
print '| ' * f.indent + '|--', f.__name__, x
f.indent += 1
value = f(x)
print '| ' * f.indent + '|--', 'return', repr(value)
f.indent -= 1
return value
return g
和
def memoize(f):
cache = {}
def g(x):
if x not in cache:
cache[x] = f(x)
return cache[x]
return g
但我不明白它是如何在语句的同一个变量上分配两个函数的:
fib = trace(fib)
fib = memoize(fib)
print fib(4)
trace 和 memoize 似乎都对最后一次调用有影响。这是为什么?
请您参考如下方法:
你写的很像
fib2 = memoize(trace(fib))
print fib2(4)
因为你在调用trace后改变了变量fib指向的函数,所以memoize被应用到跟踪版本(然后 fib 再次被“覆盖”)。
如果你想分别有一个跟踪版本和一个内存版本,你需要将它们的结果分配给不同的变量,例如:
fib_trace = trace(fib)
fib_memo = memoize(fib)
print fib_trace(4), fib_memo(4)
