Удостоверьтесь, что справились воспринятая производительность .
, Хотя все индикаторы выполнения заняли точно то же количество времени в тесте, две характеристики, сделанные пользователями думать, процесс был быстрее, даже если это не было:
- индикаторы выполнения, которые переместились гладко к завершению
- индикаторы выполнения, которые убыстрились к концу
Эта функция with_default_value
часто называется (неточно) «закрытием» (технически закрытие - это скорее внутренняя функция , которая получает вернулся, здесь newfunc
- см., например, здесь ). В более общем смысле, with_default_value
- это функция высшего порядка («HOF»): она принимает функцию ( func
) в качестве аргумента, она также возвращает функцию ( newfunc
) в качестве результата.
Я видел ответы, запутавшие это с концепцией и конструкцией декоратора в Python, что определенно не - тем более что вы упоминаете func
как часто встроенную функцию, такую как int
. Лексически вложенная функция может ссылаться (но не повторно связывать) все имена локальных переменных (включая имена аргументов, поскольку аргументы являются локальными переменными) включающей функции (функций) - вот почему она известна как замыкание: она «закрывает» эти «свободные переменные». Здесь newfunc
может ссылаться на func
и default
- и делает это.
Функции высшего порядка - очень естественная вещь в Python, тем более что функции являются объектами первого класса (поэтому вам не нужно ничего особенного делать, чтобы передавать их в качестве аргументов, возвращать их как значения функций или даже хранить их в списках или других контейнерах и т. д.), и нет различий в пространстве имен между функциями и другими видами объекты, никакого автоматического вызова функций только потому, что они упомянуты и т. д. и т. д. (It ' сложнее - немного сложнее или НАМНОГО сложнее, в зависимости от других языков, которые проводят много различий такого рода). В Python упоминание функции - это просто упоминание; ВЫЗОВ происходит только тогда, когда за объектом функции (упоминаемым по имени или иным образом) следуют круглые скобки.
Вот и все, что есть в этом примере - пожалуйста, не стесняйтесь редактировать свой вопрос, комментировать здесь и т. д. , если есть какой-то другой конкретный аспект, в котором у вас остаются сомнения!
Изменить : так что ОП вежливо прокомментировал, прося больше примеров "фабрик закрытия". Вот один - представьте себе какой-то абстрактный набор инструментов GUI, и вы пытаетесь сделать:
for i in range(len(buttons)):
buttons[i].onclick(lambda: mainwin.settitle("button %d click!" % i))
, но это работает неправильно - i
в лямбда
запаздывает -связанный, таким образом, к моменту нажатия одной кнопки значение i
всегда будет индексом последней кнопки , независимо от того, какая из них была нажата. Существуют различные возможные решения, но фабрика закрытия - изящная возможность:
def makeOnclick(message):
return lambda: mainwin.settitle(message)
for i in range(len(buttons)):
buttons[i].onclick(makeOnClick("button %d click!" % i))
Здесь мы используем фабрику закрытия, чтобы настроить время привязки переменных! -) В той или иной конкретной форме это довольно распространенный вариант использования для предприятий закрытия.
Это декоратор Python - в основном оболочка функции. (Прочтите все о декораторах в PEP 318 - http://www.python.org/dev/peps/pep-0318/ )
Если вы посмотрите код, вы, вероятно, найдете что-то вроде этого:
def some_func(name, val):
# ...
some_func = with_default_value(some_func, 'the_default_value')
Намерение этого декоратора, кажется, предоставляет значение по умолчанию, если аргументы name или val отсутствуют (предположительно, если они установлены в None).
Что касается того, почему это работает:
with_default_value возвращает объект функции, который в основном будет копией этого вложенного newfunc, с вызовом func и значение по умолчанию, замененное тем, что было передано в with_default_value.
Если кто-то делает 'foo = with_default_value (bar, 3)', возвращаемое значение будет в основном новой функцией:
def foo(name, val):
ifismissing(name, val):
return 3
else:
return bar(val)
, так что вы можете затем взять это возвращение значение, и назовите это.
Это функция, которая возвращает другую функцию. имя
и значение
являются параметрами возвращаемой функции.