Что такое генератор в Python и в чем его преимущество

Ответ

Генератор в 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))