Что такое генератор в Python?

Генератор в Python - это функция, которая использует ключевое слово yield для возврата значений по одному, по мере необходимости.

В отличие от обычных функций, генераторы не хранят все результаты в памяти сразу, а генерируют их "на лету". Это позволяет эффективно работать с большими объемами данных или бесконечными последовательностями.

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


Генератор в Python - это специальный тип итератора, который позволяет генерировать последовательность значений "лениво", то есть, по мере необходимости. В отличие от обычных функций, которые возвращают сразу весь результат вычислений в виде списка или другой коллекции, генераторы возвращают объект-генератор, который можно итерировать с помощью цикла for или функции next().

Ключевые особенности генераторов:

  • Использование yield: Генераторы определяются с использованием ключевого слова yield вместо return. Когда генератор встречает yield, он приостанавливает свое выполнение и возвращает значение, указанное после yield. При следующем вызове next() генератор возобновляет выполнение с того места, где он остановился.
  • Ленивая оценка (Lazy evaluation): Значения генерируются только тогда, когда они запрашиваются. Это экономит память, особенно при работе с большими или бесконечными последовательностями.
  • Экономия памяти: Генераторы не хранят все элементы последовательности в памяти одновременно. Вместо этого они генерируют элементы один за другим по мере запроса. Это делает их очень эффективными для работы с большими объемами данных.
  • Однократное использование: После того, как генератор полностью пройден, его нельзя использовать повторно без пересоздания.

Пример:

        
def my_generator(n):
    i = 0
    while i < n:
        yield i
        i += 1

# Создаем генератор
gen = my_generator(5)

# Итерируем по генератору
for value in gen:
    print(value) # Вывод: 0 1 2 3 4

# Или используем next()
gen = my_generator(3)
print(next(gen)) # Вывод: 0
print(next(gen)) # Вывод: 1
print(next(gen)) # Вывод: 2
try:
    print(next(gen)) # Вызывает StopIteration, так как все значения были сгенерированы
except StopIteration:
    print("Конец генератора")
        
    

Альтернативный способ создания генераторов: генераторные выражения (Generator expressions):

Генераторные выражения – это компактный способ создания генераторов, похожий на списковые включения, но возвращающий объект-генератор вместо списка.

        
# Генераторное выражение для квадратов чисел от 0 до 4
squares = (x*x for x in range(5))

for square in squares:
    print(square) # Вывод: 0 1 4 9 16
        
    

Когда использовать генераторы:

  • Для работы с большими файлами или базами данных, где загрузка всего содержимого в память нецелесообразна.
  • Для создания бесконечных последовательностей.
  • Для оптимизации использования памяти в циклах, где каждый элемент обрабатывается только один раз.
0