вающей точкой) аргумента.
Мы определим новую функцию run_with_positional_args(), принимающую
функцию и произвольное количество позиционных аргументов, которые нужно
будет передать в нее:
>>> def run_with_positional_args(func, *args):
... return func(*args)
Теперь вызовем ее:
>>> run_with_positional_args(sum_args, 1, 2, 3, 4)
10
Вы можете использовать функции как элементы списков, кортежей, множеств
и словарей. Функции неизменяемы, поэтому вы можете даже применять их как
ключи для словарей.
Внутренние функции
Вы можете определить функцию внутри другой функции:
>>> def outer(a, b):
... def inner(c, d):
... return c + d
... return inner(a, b)
...
>>>
>>> outer(4, 7)
11
Внутренние функции могут быть полезны при выполнении некоторых сложных
задач более одного раза внутри другой функции. Это позволит избежать исполь-
зования циклов или дублирования кода. Рассмотрим пример работы со строкой,
когда внутренняя функция добавляет текст к своему аргументу:
>>> def knights(saying):
... def inner(quote):
... return "We are the knights who say: '%s'" % quote
Функции
129
... return inner(saying)
...
>>> knights('Ni!')
"We are the knights who say: 'Ni!'"
Замыкания
Внутренняя функция может действовать как замыкание. Замыкание — это функ-
ция, которая динамически генерируется другой функцией, и они обе могут из-
меняться и запоминать значения переменных, которые были созданы вне функ-
ции.
Следующий пример создан на основе предыдущего примера knights(). Назовем
новую функцию knights2(), поскольку у нас нет воображения, и превратим функцию
inner() в замыкание, которое называется inner2(). Различия заключаются в следу-
ющем.
inner2() использует внешний параметр saying непосредственно, вместо того
чтобы получить его как аргумент.
knights2() возвращает имя функции inner2, вместо того чтобы вызывать ее:
>>> def knights2(saying):
... def inner2():