Есть один ответ, который, я думаю, немного смущает концепцию генератора и итератора. Поэтому я решил попробовать ответить на этот вопрос на примере метафоры.
Я работаю на кухне, мой босс поручил мне сложить 10 (или 100, или миллион) хлебов. У меня есть шкала и калькулятор (фокусы моего алгоритма). Ниже приведен итеративный объект, генератор, итератор, разность подходов:
Итерируемый объект:
Каждый хлеб хранится в одной коробке (памяти), я взвешиваю первый (или 0-й) хлеб, кладу его вес и кладу хлеб обратно в коробку, затем иду к следующей, взвешиваю и кладу обратно, и так далее, и т. д. и т. д. В конце концов, я получил общий вес, и 10 (100 или миллион) хлебов все еще находятся в их коробках.
Генератор:
Ящиков для хранения всего этого хлеба недостаточно, поэтому я попросил помощи у пекаря (генератора), он делает первый хлеб, дает его мне, я взвешиваю, кладу результат, выбрасываю этот хлеб и попросите у него еще один, и так далее, и так далее, пока я не получу последний хлеб (или, возможно, у пекаря не хватает муки). В итоге у меня результат, ни одного хлеба там нет. Но кого это волнует, мой босс только просит, чтобы я взвесил этот хлеб, он не сказал, что я не могу выбросить его (какой замечательный автобусный мастер).
Итератор:
Я прошу кого-то (итератор) помочь мне перенести первый хлеб на весы, я его взвешиваю, кладу результат вниз. Этот кто-то может взять следующий для измерения, и так далее, и т. Д. Я на самом деле понятия не имею, если кто-то (итератор) получит хлеб из коробки или от пекаря. В конце концов, я получил общий вес, для меня это не имеет значения.
В любом случае, подведем итог:
Итерируемому объекту требуется некоторое количество памяти для хранения данных для начала. В конце концов, данные все еще там.
Генератору не потребуется память для хранения данных, для начала он генерирует данные на ходу.
Итератор - это канал между алгоритмом и его данными. Эти данные могут быть уже там и сохранены в памяти или могут быть сгенерированы на ходу генератором. В первом случае эта память будет освобождаться побитно, поскольку итератор продолжает итерацию. Поэтому я очень согласен с приведенным выше ответом, что итератор хорош из-за своей абстракции, которая позволяет изолировать алгоритм и данные.
Python не совсем так работает. Надеюсь, это поможет уточнить немного.