📝 Python

Генераторы в Python: ленивые вычисления и стриминг

0
Автор
04e5cc8b-58ac-4bdc-bdee-661bbb
📅
Опубликовано
08.05.2026
⏱️
Время чтения
1 мин
👁️
Просмотров
51
🌱
Уровень
Начальный
🐦 💼 ✈️

Когда API возвращает большой ответ — текст на несколько тысяч токенов — ждать полного ответа неудобно. Вместо этого сервер присылает данные частями (чанками), а Python получает их через генератор.

Что такое генератор

Обычная функция возвращает все данные сразу:

def get_numbers():
    return [1, 2, 3, 4, 5]  # весь список в памяти сразу

for n in get_numbers():
    print(n)

Генератор возвращает значения по одному, не загружая всё в память:

def get_numbers():
    for i in range(1, 6):
        yield i  # ← keyword yield вместо return

for n in get_numbers():
    print(n)  # 1, 2, 3, 4, 5 — по одному

yield приостанавливает функцию и возвращает текущее значение. При следующей итерации функция продолжается с того места где остановилась.

Итерация по генератору

Генератор — это итерируемый объект, как список или строка:

gen = get_numbers()   # создаём генератор (ещё не вычисляет)
print(next(gen))      # 1 — берём первое значение
print(next(gen))      # 2 — берём следующее
print(next(gen))      # 3

# Или в цикле:
for value in gen:
    print(value)      # 4, 5 (1, 2, 3 уже взяты)

Генераторы в стриминге API

SDK Gemini возвращает объект-генератор при stream=True:

response = model.generate_content("Напиши рассказ", stream=True)

# response — генератор чанков
for chunk in response:
    print(chunk.text, end="", flush=True)
print()  # перевод строки в конце

Каждый chunk — часть ответа. Текст появляется постепенно, как в чате.

flush=True — зачем?

Python буферизует вывод для эффективности. flush=True сбрасывает буфер немедленно — текст появляется на экране сразу, не дожидаясь буфера.

print("Hello", end="", flush=True)   # видно сразу
print("Hello", end="")               # может задержаться в буфере

Генераторное выражение

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

squares_list = [x**2 for x in range(1000)]   # список: все 1000 элементов в памяти
squares_gen  = (x**2 for x in range(1000))   # генератор: вычисляет по одному

# Использование одинаковое:
for sq in squares_gen:
    print(sq)

Скобки () вместо [] — и это уже генератор.

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

Генератор нужен когда:
- Данные приходят постепенно (стриминг API)
- Набор данных большой и не помещается в память
- Нужен ленивый пайплайн обработки данных

Список лучше когда:
- Нужен произвольный доступ по индексу (items[5])
- Данные нужны несколько раз
- Набор данных небольшой

Итог

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

Ваша реакция на статью

💬 Комментарии (0)

🔐 Войдите в систему, чтобы оставить комментарий
🚪 Войти
💭

Комментариев пока нет

Станьте первым, кто поделится мнением об этой статье!

🔗 Похожие

Похожие статьи

Продолжите изучение с этими материалами

📝

Подготовка окружения: Python, pip и VS Code

Прежде чем писать код локально — нужно подготовить три инструмента: Python, pip и VS Code....

📅 04.06.2026 👁️ 17
📝

Модуль datetime: работа с датами и временем

datetime — стандартный модуль Python для работы с датами и временем. Входит в стандартную библиотеку,...

📅 08.05.2026 👁️ 67
📝

.env файлы и переменные окружения: секреты вне ко…

Представь что ты написал программу с API-ключом прямо в коде и залил её на GitHub....

📅 08.05.2026 👁️ 76

Понравилась статья?

Подпишитесь на наши обновления и получайте новые статьи первыми. Развивайтесь вместе с PyLand!