> Что такое итераторы и генераторы в Python и в чем их разница (Python)
Уровень: junior · Роль: backend · Категория: Технические вопросы
Компании: Сбер
Стек: Python
> Пример ответа
Итераторы и генераторы - это механизмы для последовательного перебора элементов, но они имеют ключевые различия.
Итератор - это объект, который реализует протокол итерации: методы __iter__() (возвращает сам итератор) и __next__() (возвращает следующий элемент или выбрасывает исключение StopIteration). Любой итератор можно обойти с помощью цикла for. Пример: list, tuple, str - это итерируемые объекты, а их итераторы создаются функцией iter().
Генератор - это частный случай итератора. Он создается с помощью функции с ключевым словом yield или генераторного выражения (например, (x**2 for x in range(10))). При каждом вызове next() генератор приостанавливает выполнение до следующего yield, сохраняя состояние между вызовами. Генераторы ленивы - они вычисляют значения на лету, что экономит память.
Основные различия:
- Создание: Итераторы реализуются через классы с методами
__iter__и__next__. Генераторы - через функции сyieldили выражения. - Состояние: Генераторы автоматически сохраняют локальное состояние и позицию выполнения. Итераторы требуют ручного управления состоянием (например, через атрибуты класса).
- Простота: Генераторы короче и удобнее для создания последовательностей, особенно бесконечных. Итераторы дают больше контроля, но требуют больше кода.
- Одноразовость: И генераторы, и итераторы можно обойти только один раз (если не создавать новый объект).
Пример генератора:
PYTHONdef count_up_to(n):i = 1while i <= n:yield ii += 1
Пример итератора:
PYTHONclass CountUpTo:def __init__(self, n):self.n = nself.i = 1def __iter__(self):return selfdef __next__(self):if self.i > self.n:raise StopIterationresult = self.iself.i += 1return result
На практике для простых задач предпочитают генераторы, а итераторы - когда нужна сложная логика перебора или работа с внешними ресурсами.
> Похожие задачи по backend
Какова временная сложность добавления элемента в список Python в конец, начало и середину
Удалится ли циклическая структура из памяти и когда это происходит в Python?
Какие минусы могут быть от использования индексов
В чем разница между Uvicorn и Gunicorn
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью