📝 Python

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

P
Автор
PyLand Team
📅
Опубликовано
08.05.2026
⏱️
Время чтения
1 мин
👁️
Просмотров
364
🌳
Уровень
Продвинутый

Когда 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)

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

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

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

🔗 Похожие

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

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

📝

if __name__ == "__main__": точка входа Python

Конструкция if name == "main" определяет точку входа Python-программы: она помогает отличить прямой запуск файла...

📅 14.08.2026 👁️ 44
📝

strip() и lower(): подготавливаем пользовательски…

Пользователь может ввести правильное слово с лишними пробелами или буквами другого регистра. Для Python строки...

📅 11.08.2026 👁️ 50
📝

ord(), chr() и циклический сдвиг букв в Python 🔐

Строка состоит из символов, но компьютер хранит каждый символ как числовой код. Python позволяет переходить...

📅 09.08.2026 👁️ 89
🎓 Продолжить обучение

В каких курсах используется этот материал

Перейдите к курсу, чтобы закрепить материал на практике.

API на практике: взаимодействие с любыми сервисами Открыть программу курса