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

>>> edit_story(stairs, enliven)

Thud!

Meow!

Thud!

Hiss!

Наконец переходим к лямбде. Функция enliven() была такой короткой, что мы

можем заменить ее лямбдой:

>>>

>>> edit_story(stairs, lambda word: word.capitalize() + '!')

Thud!

Генераторы

131

Meow!

Thud!

Hiss!

>>>

Лямбда принимает один аргумент, который в этом примере назван word. Все, что

находится между двоеточием и закрывающей скобкой, является определением

функции.

Часто использование настоящих функций вроде enliven() гораздо прозрачнее,

чем использование лямбд. Лямбды наиболее полезны в случаях, когда вам нужно

определить множество мелких функций и запомнить все их имена. В частности,

вы можете использовать лямбды в графических пользовательских интерфейсах,

чтобы определить функции внешнего вызова. Примеры вы можете найти в прило-

жении А.

Генераторы

В Python генератор — это объект, который предназначен для создания последова-

тельностей. С его помощью вы можете проитерировать потенциально огромные

последовательности без необходимости создания и сохранения всей последова-

тельности в память сразу. Генераторы часто становятся источником данных

для итераторов. Как вы помните, мы уже использовали один из них, range(),

в примерах кода для того, чтобы сгенерировать последовательность целых чи-

сел. В Python 2 функция range() возвращает список, ограниченный так, чтобы он

помещался в память. В Python 2 также есть функция xrange(), которая стала

обычной функцией range() в Python 3. В этом примере складываются все целые

числа от 1 до 100:

>>> sum(range(1, 101))

5050

Каждый раз, когда вы итерируете через генератор, он отслеживает, где он на-

ходился во время последнего вызова, и возвращает следующее значение. Это от-

личает его от обычной функции, которая не помнит о предыдущих вызовах и все гда

начинает работу с первой строки и в неизменном состоянии.

Если вы хотите создать потенциально большую последовательность и ее код

слишком велик для того, чтобы создать включение генератора, напишите функцию

генератора. Это обычная функция, но она возвращает значение с помощью выра-

жения yield, а не return. Напишем собственную функцию range():

>>> def my_range(first=0, last=10, step=1):

... number = first

... while number < last:

... yield number