Найти в Дзене

Генераторы (Generators) в Python

Генератор — это функция, которая возвращает последовательность значений лениво (по требованию). Генераторы создаются с помощью ключевого слова yield и позволяют сохранять состояние между вызовами. Они не хранят все элементы в памяти, что эффективно для работы с большими данными. Когда функция содержит yield, она автоматически становится генератором. При вызове next() выполнение функции приостанавливается на yield, а при следующем вызове возобновляется с того же места. Аналогичны списковым включениям, но используют круглые скобки () и возвращают элементы по одному. Критерий Списковое включение Генератор Память Хранит все элементы в памяти Генерирует элементы на лету Использование Для небольших данных Для больших данных Пример [x**2 for x in range(10)] (x**2 for x in range(10)) Передает значение в генератор (становится результатом yield). Вызывает исключение внутри генератора. Останавл
Оглавление

Определение

Генератор — это функция, которая возвращает последовательность значений лениво (по требованию). Генераторы создаются с помощью ключевого слова yield и позволяют сохранять состояние между вызовами. Они не хранят все элементы в памяти, что эффективно для работы с большими данными.

Ключевое слово yield

Когда функция содержит yield, она автоматически становится генератором. При вызове next() выполнение функции приостанавливается на yield, а при следующем вызове возобновляется с того же места.

-2

Генераторные выражения

Аналогичны списковым включениям, но используют круглые скобки () и возвращают элементы по одному.

-3

Сравнение с включениями (Comprehensions)

Критерий Списковое включение Генератор

Память Хранит все элементы в памяти Генерирует элементы на лету

Использование Для небольших данных Для больших данных

Пример [x**2 for x in range(10)] (x**2 for x in range(10))

Методы генераторов

1. send(value)

Передает значение в генератор (становится результатом yield).

-4

2. throw(type)

Вызывает исключение внутри генератора.

-5

3. close()

Останавливает генератор.

-6

Корутины (Coroutines)

Генераторы с send() могут использоваться как корутины — функции, обменивающиеся данными с вызывающим кодом. Это основа асинхронного программирования в Python (до появления async/await).

-7

Копирование генераторов

Генераторы нельзя скопировать стандартными методами (deepcopy, copy, срезы), так как они хранят состояние выполнения.

Примеры ошибок:

-8

Решение:

- Пересоздайте генератор.

- Используйте itertools.tee() для разделения итератора на несколько (но это работает только для некоторых итераторов).

-9

Заключение

- Генераторы идеальны для работы с большими данными или бесконечными последовательностями.

- Генераторные выражения экономят память, заменяя списковые включения.

- Методы send(), throw(), close() расширяют возможности генераторов, превращая их в корутины.

- Корутины позволяют реализовать кооперативную многозадачность.

- Копирование генераторов невозможно из-за их состояния — используйте пересоздание или itertools.tee().

Совет: Для сложных сценариев (например, асинхронности) используйте современные конструкции asyncio и async/await, которые развивают идеи генераторов.