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

Какие знаешь особенности генератора в Python?

1.7 Middle🔥 81 комментариев
#Python

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

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

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

Генераторы в Python: ключевые особенности

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

Основные характеристики

Ленивое вычисление (Lazy Evaluation) Генератор не вычисляет все значения сразу, а генерирует их по требованию. Это критично при работе с большими датасетами — экономит память:

# Обычная функция — вся память сразу
def create_numbers(n):
    result = []
    for i in range(n):
        result.append(i * 2)
    return result

# Генератор — по одному значению
def generate_numbers(n):
    for i in range(n):
        yield i * 2

# Сравнение памяти
import sys
normal = create_numbers(1000000)
gen = generate_numbers(1000000)
print(f"List: {sys.getsizeof(normal)} bytes")  # ~8MB
print(f"Generator: {sys.getsizeof(gen)} bytes")  # ~128 bytes

Состояние между вызовами

Генератор сохраняет состояние между итерациями. Когда вызываешь next(), выполнение продолжается ровно с того места, где остановилась предыдущая итерация:

def count_up(max_val):
    n = 0
    while n < max_val:
        print(f"Вычисляю: {n}")
        yield n
        n += 1

gen = count_up(3)
print(next(gen))  # Вычисляю: 0 → 0
print(next(gen))  # Вычисляю: 1 → 1
# Состояние n=1 сохранилось между вызовами

Двусторонняя коммуникация

С помощью метода send() можно передавать значения в генератор:

def process_data():
    while True:
        value = yield
        if value is not None:
            print(f"Получил: {value}")

gen = process_data()
next(gen)  # Инициализация
gen.send(42)  # Передача значения в генератор

Встроенные методы

  • send(value) — отправить значение в генератор
  • throw(exception) — выбросить исключение в генератор
  • close() — остановить генератор

Практическое применение в DS

В моей работе генераторы помогают при:

  1. Обработке больших файлов — читаю CSV построчно:
def read_large_csv(filename, chunk_size=1000):
    with open(filename) as f:
        chunk = []
        for line in f:
            chunk.append(line)
            if len(chunk) == chunk_size:
                yield chunk
                chunk = []
        if chunk:
            yield chunk
  1. Батчировании данных для обучения моделей
  2. Pipeline обработки без загрузки всех данных в RAM

Отличие от обычных функций

Генератор возвращает объект-итератор, а не список. Он работает ровно один раз по элементам — нельзя перебрать дважды без пересоздания.

Это фундаментальный инструмент, который отличает опытного Python-разработчика от новичка, особенно в контексте работы с big data.

Какие знаешь особенности генератора в Python? | PrepBro