Как этот Python может функционировать работа кода?

Удостоверьтесь, что справились воспринятая производительность .

, Хотя все индикаторы выполнения заняли точно то же количество времени в тесте, две характеристики, сделанные пользователями думать, процесс был быстрее, даже если это не было:

  1. индикаторы выполнения, которые переместились гладко к завершению
  2. индикаторы выполнения, которые убыстрились к концу

6
задан Pete 23 September 2009 в 02:19
поделиться

4 ответа

Эта функция 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))

Здесь мы используем фабрику закрытия, чтобы настроить время привязки переменных! -) В той или иной конкретной форме это довольно распространенный вариант использования для предприятий закрытия.

8
ответ дан 8 December 2019 в 16:06
поделиться

Это декоратор 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).

6
ответ дан 8 December 2019 в 16:06
поделиться

Что касается того, почему это работает:

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)

, так что вы можете затем взять это возвращение значение, и назовите это.

1
ответ дан 8 December 2019 в 16:06
поделиться

Это функция, которая возвращает другую функцию. имя и значение являются параметрами возвращаемой функции.

0
ответ дан 8 December 2019 в 16:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: