Когда 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 генераторы позволяют обрабатывать ответ сразу по мере поступления данных, не дожидаясь пока сервер отправит всё целиком.
💬 Comments (0)
No comments yet
Be the first to share your opinion about this article!