Ответ
Генератор в Python — это особый тип итератора, создаваемый с помощью функции с ключевым словом yield
. В отличие от обычной функции, которая выполняет весь код и возвращает результат через return
, генератор «замораживает» свое состояние при каждом вызове yield
, отдавая одно значение, и возобновляет работу с того же места при следующем запросе.
Ключевое преимущество — эффективность по памяти. Генераторы не создают и не хранят всю коллекцию данных в памяти сразу. Они генерируют значения «на лету», по одному, что делает их идеальными для работы с большими или бесконечными последовательностями.
Основные особенности:
- Используют
yield
для возврата значения. - Сохраняют свое состояние между вызовами.
- При завершении автоматически вызывают исключение
StopIteration
.
Пример функции-генератора:
# Этот генератор может работать с огромными числами, не занимая память
def count_up_to(max_num):
count = 1
while count <= max_num:
yield count
count += 1
# Использование
counter = count_up_to(3)
print(next(counter)) # Вывод: 1
print(next(counter)) # Вывод: 2
print(next(counter)) # Вывод: 3
# следующий вызов next(counter) вызовет StopIteration
Также существуют генераторные выражения — краткий синтаксис для создания генераторов, похожий на списковые включения (list comprehensions), но с круглыми скобками.
# Создает генератор, который будет вычислять квадраты по мере необходимости
squares_generator = (x * x for x in range(1000000))