... return inner2
...
Функция inner2() знает значение переменой saying, которое было передано
в функцию, и запоминает его. Строка inner2 возвращает эту особую копию функции
inner2, но не вызывает ее. Это и есть замыкание: динамически созданная функция,
которая запоминает, откуда она появилась.
Вызовем функцию knights2() два раза с разными аргументами:
>>> a = knights2('Duck')
>>> b = knights2('Hasenpfeffer')
О’кей, чем являются a и b?
>>> type(a)
<class 'function'>
>>> type(b)
<class 'function'>
Они являются функциями, а также замыканиями:
>>> a
<function knights2.<locals>.inner2 at 0x10193e158>
>>> b
<function knights2.<locals>.inner2 at 0x10193e1e0>
130
Глава 4. Корочка Python: структуры кода
Если мы вызовем их, они запомнят значение переменной saying, которое было
использовано, когда они были созданы функцией knights2:
>>> a()
"We are the knights who say: 'Duck'"
>>> b()
"We are the knights who say: 'Hasenpfeffer'"
Анонимные функции: функция lambda()
В Python лямбда-функция — это анонимная функция, выраженная одним выраже-
нием. Вы можете использовать ее вместо обычной маленькой функции.
Для того чтобы проиллюстрировать анонимные функции, сначала создадим
пример, в котором используются обычные функции. Для начала мы определим
функцию edit_story(). Она имеет следующие аргументы:
words — список слов;
func — функция, которая должна быть применена к каждому слову в списке
words:
>>> def edit_story(words, func):
... for word in words:
... print(func(word))
Теперь нам нужны список слов и функция, которую требуется к ним применить.
В качестве слов я возьму список звуков (гипотетических), которые мог бы издать
мой кот, если бы (гипотетически) он не заметил одну из лестниц:
>>> stairs = ['thud', 'meow', 'thud', 'hiss']
Функция же запишет с большой буквы каждое слово и добавит к нему воскли-
цательный знак, что идеально подойдет для заголовка какой-нибудь желтой коша-
чьей газетенки:
>>> def enliven(word): # больше эмоций!
... return word.capitalize() + '!'
Смешаем наши ингредиенты: