← Назад к вопросам

Приведи пример использования генератора

1.2 Junior🔥 191 комментариев
#Python Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Генераторы в Python

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

Базовый пример

def fibonacci(n):
    a, b = 0, 1
    for _ in range(n):
        yield a
        a, b = b, a + b

for num in fibonacci(10):
    print(num)  # 0, 1, 1, 2, 3, 5, 8, 13, 21, 34

Почему генераторы полезны

Ленивые вычисления — генератор не хранит все значения в памяти одновременно. Это критично при работе с большими данными:

def read_large_file(filepath):
    with open(filepath, 'r') as f:
        for line in f:
            yield line.strip()

for line in read_large_file('huge_log.txt'):
    if 'ERROR' in line:
        print(line)

Generator Expression

Аналог list comprehension, но ленивый:

squares_list = [x**2 for x in range(1_000_000)]  # ~8 МБ RAM
squares_gen = (x**2 for x in range(1_000_000))    # ~120 байт RAM
print(sum(squares_gen))

Конвейер обработки данных

def parse_logs(lines):
    for line in lines:
        yield line.split('|')

def filter_errors(records):
    for record in records:
        if record[1].strip() == 'ERROR':
            yield record

lines = read_large_file('app.log')
parsed = parse_logs(lines)
errors = filter_errors(parsed)

for error in errors:
    print(error[2].strip())

send() и двусторонняя коммуникация

def accumulator():
    total = 0
    while True:
        value = yield total
        if value is not None:
            total += value

acc = accumulator()
next(acc)
print(acc.send(10))  # 10
print(acc.send(20))  # 30

Когда использовать

  • Большие файлы — построчная обработка без загрузки в RAM
  • Бесконечные последовательности — числа Фибоначчи, потоки данных
  • Конвейеры — цепочки трансформаций данных
  • Экономия памяти — когда не нужен весь список сразу

Генераторы — один из самых мощных инструментов Python для работы с данными. Они лежат в основе asyncio, itertools и многих библиотек.

Приведи пример использования генератора | PrepBro