Итератор реализует iter и next, а генератор — удобный способ создать итератор через функцию с yield. yield from делегирует перебор другому итерируемому объекту.
Чем протокол итератора отличается от генератора? Какая разница между использованием ключевого слова yield и yield from, и как генераторы помогают экономить оперативную память при обработке больших объемов данных?
Итератор реализует __iter__ и __next__, а генератор — удобный способ создать итератор через функцию с yield. yield from делегирует перебор другому итерируемому объекту.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Итератор реализует iter и next, а генератор — удобный способ создать итератор через функцию с yield. yield from делегирует перебор другому итерируемому объекту.
При yield функция сохраняет состояние и возвращает одно значение до следующего запроса. yield from iterable передаёт последовательность значений, а при делегировании генератору также поддерживает взаимодействие через send/throw и его итоговый return.
Генератор не обязан хранить весь результат: можно читать файл строками и обрабатывать поток. Но list(generator) снова материализует данные, а локальные переменные приостановленного генератора занимают память. Генераторы обычно одноразовые; после исчерпания для повторного обхода нужен новый экземпляр.