📝 Python

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

0
Author
04e5cc8b-58ac-4bdc-bdee-661bbb
📅
Published
08.05.2026
⏱️
Reading time
1 min
👁️
Views
22
🌱
Level
Beginner

Когда 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 генераторы позволяют обрабатывать ответ сразу по мере поступления данных, не дожидаясь пока сервер отправит всё целиком.

Your reaction to the article

💬 Comments (0)

🔐 Sign in to leave a comment
🚪 Login
💭

No comments yet

Be the first to share your opinion about this article!

🔗 Similar

Similar articles

Continue learning with these materials

📝

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

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

📅 08.05.2026 👁️ 30
📝

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

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

📅 08.05.2026 👁️ 34
📝

Виртуальные окружения в Python: зачем и как

Когда начинаешь второй Python-проект и ставишь pip install requests — эта библиотека устанавливается глобально, для...

📅 08.05.2026 👁️ 30

Did you like the article?

Subscribe to our updates and receive new articles first. Grow with PyLand!