Вызовем функцию knights2() два раза с разными аргументами:
>>>> a = knights2('Duck')
>>>> b = knights2('Hasenpfeffer')
О’кей, чем являются a и b?
>>>> type(a)
>
>>>> type(b)
>
Они являются функциями, а также замыканиями:
>>>> a
>.inner2 at 0x10193e158>
>>>> b
>.inner2 at 0x10193e1e0>
Если мы вызовем их, они запомнят значение переменной 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() + '!'
Смешаем наши ингредиенты:
>>>> edit_story(stairs, enliven)
>Thud!
>Meow!
>Thud!
>Hiss!
Наконец переходим к лямбде. Функция enliven() была такой короткой, что мы можем заменить ее лямбдой:
>>>>
>>>> edit_story(stairs, lambda word: word.capitalize() + '!')
>Thud!
>Meow!
>Thud!
>Hiss!
>>>>
Лямбда принимает один аргумент, который в этом примере назван word. Все, что находится между двоеточием и закрывающей скобкой, является определением функции.
Часто использование настоящих функций вроде enliven() гораздо прозрачнее, чем использование лямбд. Лямбды наиболее полезны в случаях, когда вам нужно определить множество мелких функций и запомнить все их имена. В частности, вы можете использовать лямбды в графических пользовательских интерфейсах, чтобы определить функции внешнего вызова. Примеры вы можете найти в приложении А.