Простой Python. Современный стиль программирования (Любанович) - страница 68

Вызовем функцию 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() гораздо прозрачнее, чем использование лямбд. Лямбды наиболее полезны в случаях, когда вам нужно определить множество мелких функций и запомнить все их имена. В частности, вы можете использовать лямбды в графических пользовательских интерфейсах, чтобы определить функции внешнего вызова. Примеры вы можете найти в приложении А.

Генераторы

В Python генератор — это объект, который предназначен для создания последовательностей. С его помощью вы можете проитерировать потенциально огромные последовательности без необходимости создания и сохранения всей последовательности в память сразу. Генераторы часто становятся источником данных для итераторов. Как вы помните, мы уже использовали один из них, range(), в примерах кода для того, чтобы сгенерировать последовательность целых чисел. В Python 2 функция range() возвращает список, ограниченный так, чтобы он помещался в память. В Python 2 также есть функция xrange(), которая стала обычной функцией range() в Python 3. В этом примере складываются все целые числа от 1 до 100: