функция python с более высоким порядком

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 для лучшего понимания функций более высокого порядка, но мне трудно понять, почему new_fact (2) на шаге 8 сопоставляется с трассировкой? Другими словами, как распознанная функция знает, что аргумент равен 2?

    В 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