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