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

ных скобок у выделения списка на круглые создаст включение кортежа. Может

даже показаться, что это работает, поскольку исключение не будет сгенерировано,

если вы напишете следующее:

>>> number_thing = (number for number in range(1, 6))

В круглые скобки заключено включение генератора, оно возвращает объект

генератора:

>>> type(number_thing)

<class 'generator'>

Сами генераторы мы рассмотрим более детально позже в данной главе. При-

менение генераторов — это один из способов предоставить данные итератору.

Вы можете итерировать непосредственно по этому объекту генератора, как по-

казано здесь:

>>> for number in number_thing:

... print(number)

...

1

2

3

4

5

Или же вы можете обернуть вызов list() вокруг включения генератора, чтобы

заставить его работать как включение списка:

>>> number_list = list(number_thing)

>>> number_list

[1, 2, 3, 4, 5]

Генератор может быть запущен лишь однажды. Списки, множества и словари существуют

в памяти, но генератор создает свои значения во время работы программы и выдает их по

одному за раз через итератор. Он не запоминает их, поэтому вы не можете перезапустить

или создать резервную копию генератора.

Если вы попробуете проитерировать по генератору заново, то обнаружите, что

он истощен:

>>> try_again = list(number_thing)

>>> try_again

[]

118

Глава 4. Корочка Python: структуры кода

Вы можете создать генератор из включения генератора, как мы сделали это здесь,

или из функции генератора. Сначала мы поговорим о функциях в целом, а затем

рассмотрим частный случай — функции генератора.

Функции

До этого момента все наши примеры кода представляли собой небольшие фраг-

менты. Они годятся для решения небольших задач, но никто не хочет набирать эти

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

мент кода в более удобные фрагменты.

Первый шаг к повторному использованию кода — это создание функций. Функ-

ция — это именованный фрагмент кода, отделенный от других. Она может при-

нимает любое количество любых входных параметров и возвращать любое коли-

чество любых результатов.

С функцией можно сделать две вещи:

 определить;