0
def tracer(fn):    
    def traced(x):
       print('Calling',fn,'(',x,')')
       result=fn(x)
       print('Got',result,'from',fn,'(',x,')')
       return result
    return traced

def fact(n):   
 if n ==0:
    return 1
 return n * fact(n-1)

new_fact = tracer(fact)  
new_fact(2)

我在 pythontutor.com 上使用了这段代码来更好地理解高阶函数,但我很难理解为什么第 8 步中的 new_fact(2) 被映射到跟踪?换句话说,被跟踪函数如何知道参数是 2?

4

1 回答 1

4

在 Python 中,函数也是对象。当你调用tracer()函数时,它返回嵌套traced()函数;它实际上是在创建该函数的新副本:

return traced

您将返回的函数对象存储在 中new_fact,然后调用它:

>>> tracer(fact)
<function traced at 0x10644c320>
>>> new_fact = tracer(fact)
>>> new_fact
<function traced at 0x10644c398>
>>> new_fact(2)
('Calling', <function fact at 0x10644c230>, '(', 2, ')')
('Got', 2, 'from', <function fact at 0x10644c230>, '(', 2, ')')
2

您可以使用任何功能执行此操作;以另一个名称存储对函数的引用:

>>> def foo(): print 'foo'
... 
>>> bar = foo
>>> bar()
foo
于 2013-08-17T09:36:06.440 回答