функция 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?

One Solution collect form web for “функция python с более высоким порядком”

В 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 
  • Имя метода упаковки в определении
  • Функции Python: передавать глобальные переменные, если они только обращаются к ним?
  • Python сон, не мешая скрипту?
  • Локальная переменная, привязанная до назначения в Python
  • имя метода переменной python
  • return имя переменной извне функции, как строка внутри функции python
  • Поиск параметров функции в Python
  • Создание класса точек в Python
  •  
    Interesting Posts for Van-Lav

    Сортировка запроса с помощью ListProperty (NDB)

    Установите формат ячеек в таблице Google Таблиц, используя его API и Python

    Невозможно запустить две интерактивные оболочки, используя popen

    Предварительная обработка тензора тензора в Numpy

    Как сделать не равным в фильтрации запросов Django?

    Python 2.6 на MacOSX – ImportError: нет модуля с именем _collections

    Лучший способ записывать вызовы методов в Python?

    python xlrd неподдерживаемый формат или поврежденный файл.

    Связи OpenCV Python: как я могу захватить изображение из памяти

    Как использовать функцию уменьшения в списке кортежей?

    Сельдерей – Получить идентификатор задачи для текущей задачи

    После перехода в хранилище данных с высокой репликацией

    групповые индексы списка в списке списков

    Django 1.8 Migrations – объект «NoneType» не имеет атрибута «_meta»

    В Pandon pandas начните индексировать строку с 1 вместо нуля, не создавая дополнительный столбец

    Python - лучший язык программирования в мире.