Чем протокол итератора отличается от генератора? Какая разница между использованием ключевого слова yield и yield from, и как генераторы помогают экономить оперативную память при обработке больших объемов данных?

Итератор реализует __iter__ и __next__, а генератор — удобный способ создать итератор через функцию с yield. yield from делегирует перебор другому итерируемому объекту.

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

Что ответить на собеседовании

Итератор реализует iter и next, а генератор — удобный способ создать итератор через функцию с yield. yield from делегирует перебор другому итерируемому объекту.

Подробный разбор

Ответ с пояснениями

Итератор реализует iter и next, а генератор — удобный способ создать итератор через функцию с yield. yield from делегирует перебор другому итерируемому объекту.

При yield функция сохраняет состояние и возвращает одно значение до следующего запроса. yield from iterable передаёт последовательность значений, а при делегировании генератору также поддерживает взаимодействие через send/throw и его итоговый return.

Генератор не обязан хранить весь результат: можно читать файл строками и обрабатывать поток. Но list(generator) снова материализует данные, а локальные переменные приостановленного генератора занимают память. Генераторы обычно одноразовые; после исчерпания для повторного обхода нужен новый экземпляр.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее