> Что такое итераторы и генераторы в Python и в чем их разница (Python)

Уровень: junior · Роль: backend · Категория: Технические вопросы

Компании: Сбер

Стек: Python

> Пример ответа

Короткий ответ

Итератор - это объект, который возвращает элементы последовательности по одному через метод __next__(). Генератор - это функция с yield, которая при вызове возвращает итератор. Разница: генераторы - это удобный способ создания итераторов, они лениво вычисляют значения и автоматически управляют состоянием, тогда как итераторы требуют явной реализации методов __iter__ и __next__.

Подробное объяснение

Итератор - это объект, поддерживающий протокол итерации: метод __iter__(), возвращающий сам объект, и __next__(), возвращающий следующий элемент или бросающий StopIteration. Любая последовательность (список, строка) - итерируемый объект, но не обязательно итератор.

Генератор - это функция, содержащая yield. При вызове она не выполняет тело, а возвращает объект-генератор, который является итератором. Каждый вызов next() выполняет код до ближайшего yield и приостанавливает выполнение, сохраняя локальное состояние.

Ключевые различия:

  • Синтаксис: итератор - класс с методами, генератор - функция с yield
  • Состояние: генератор хранит состояние автоматически, итератор - вручную через атрибуты
  • Память: оба ленивые, но генераторы проще и короче
  • Генератор можно использовать один раз, итератор - тоже, если не реализован __iter__ возвращающий новый объект

На практике

Для backend-разработки генераторы критически важны при работе с большими данными: чтение файлов построчно, обработка потоков, пагинация. Генераторные выражения (x for x in range(10)) экономят память по сравнению со списковыми включениями.

Итераторы чаще нужны при создании собственных коллекций или обёрток над внешними источниками данных. Например, итератор для чтения из API с пагинацией.

Пример кода

PYTHON
# Итератор
class Counter:
def __init__(self, limit):
self.limit = limit
self.value = 0
def __iter__(self):
return self
def __next__(self):
if self.value >= self.limit:
raise StopIteration
self.value += 1
return self.value
# Генератор
def counter_gen(limit):
value = 0
while value < limit:
value += 1
yield value
# Использование одинаковое
for item in Counter(3):
print(item) # 1 2 3
for item in counter_gen(3):
print(item) # 1 2 3

Как отвечать на собеседовании

Начни с определения итератора, затем перейди к генератору. Подчеркни, что генератор - это частный случай итератора, создаваемый через yield. Обязательно упомяни ленивые вычисления и экономию памяти. Приведи пример из реальной backend-задачи: чтение большого файла.

Если спросят про send(), throw(), close() - это методы генератора, которые позволяют передавать данные внутрь и управлять завершением. Для junior достаточно упомянуть их существование.

Что проверяет интервьюер

Интервьюер оценивает:

  • Понимание протокола итерации и StopIteration
  • Различие между итерируемым объектом и итератором
  • Понимание ленивых вычислений
  • Умение объяснить, когда что использовать
  • Знание синтаксиса yield и yield from

Типичные ошибки

  • Путаница между итерируемым объектом и итератором: список - итерируемый, но не итератор
  • Утверждение, что генератор - это функция, а не объект
  • Забывают про StopIteration при ручной реализации
  • Говорят, что генератор хранит все значения в памяти - это неверно
  • Не упоминают, что генератор одноразовый: после исчерпания его нельзя переиспользовать

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью