Простой Python. современный стиль программирования - читать онлайн бесплатно полную версию книги . Страница 95

... return "We are the knights who say: '%s'" % saying

... 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() + '!'

Смешаем наши ингредиенты: