JET School

Что такое Генераторы?

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

Генераторы реализуют ленивую генерацию данных (lazy evaluation), что означает, что значения вычисляются только тогда, когда они действительно нужны. Это делает генераторы крайне эффективными в плане использования памяти и производительности.

Простой пример:

def say_hello():

yield "Привет"

yield "Как дела?"

yield "До свидания"

Вызов такой функции возвращает объект генератора:

g = say_hello()

print(next(g)) # Привет

print(next(g)) # Как дела?

print(next(g)) # До свидания

После исчерпания значений возникает исключение StopIteration.

Где применяются генераторы:

  • Чтение больших файлов построчно: Вместо загрузки всего файла в память, чтение строк по мере необходимости.
  • Обработка потоков данных (streaming): Например, чтение с веб-камеры или из API.
  • Веб-скрейпинг: Получение и обработка данных с сайтов по шагам.
  • Создание бесконечных последовательностей, таких как числа Фибоначчи, натуральные числа и т.д.

Пример – генератор чисел Фибоначчи:

def fibonacci():

a, b = 0, 1

while True:

yield a

a, b = b, a + b

f = fibonacci()

for _ in range(10):

print(next(f)) # Печатает первые 10 чисел Фибоначчи

Отличия от итераторов:

Каждый генератор является итератором, но не каждый итератор — генератор. Генераторы автоматически реализуют протокол итераторов, включая методы __iter__() и __next__(), упрощая их создание.

Преимущества генераторов:

  • Экономия памяти – работает с данными поэтапно.
  • Производительность – особенно при больших объемах данных.
  • Удобство и чистота кода – генераторы делают код более модульным и понятным.

Связанные термины:

Присоединяйтесь к нашим курсам для углубленного изучения области ИТ. Отправьте запрос для получения подробной информации!