> Что такое итераторы и генераторы в 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 = limitself.value = 0def __iter__(self):return selfdef __next__(self):if self.value >= self.limit:raise StopIterationself.value += 1return self.value# Генераторdef counter_gen(limit):value = 0while value < limit:value += 1yield value# Использование одинаковоеfor item in Counter(3):print(item) # 1 2 3for item in counter_gen(3):print(item) # 1 2 3
Как отвечать на собеседовании
Начни с определения итератора, затем перейди к генератору. Подчеркни, что генератор - это частный случай итератора, создаваемый через yield. Обязательно упомяни ленивые вычисления и экономию памяти. Приведи пример из реальной backend-задачи: чтение большого файла.
Если спросят про send(), throw(), close() - это методы генератора, которые позволяют передавать данные внутрь и управлять завершением. Для junior достаточно упомянуть их существование.
Что проверяет интервьюер
Интервьюер оценивает:
- Понимание протокола итерации и
StopIteration - Различие между итерируемым объектом и итератором
- Понимание ленивых вычислений
- Умение объяснить, когда что использовать
- Знание синтаксиса
yieldиyield from
Типичные ошибки
- Путаница между итерируемым объектом и итератором: список - итерируемый, но не итератор
- Утверждение, что генератор - это функция, а не объект
- Забывают про
StopIterationпри ручной реализации - Говорят, что генератор хранит все значения в памяти - это неверно
- Не упоминают, что генератор одноразовый: после исчерпания его нельзя переиспользовать
> Похожие задачи по backend
В чем разница между Uvicorn и Gunicorn
Какие минусы могут быть от использования индексов
Удалится ли циклическая структура из памяти и когда это происходит в Python?
Какова временная сложность добавления элемента в список Python в конец, начало и середину
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью