Итератор используется для итерации по объектам в коллекции, будь то массив, связанный список, дерево, хеш-карта, что угодно. У вас есть куча объектов, и вы хотите что-то сделать с каждым из них.
Генератор не просто возвращает элементы из некоторой конечной коллекции объектов. Вместо этого он генерирует их на лету. Вы можете концептуализировать его как итератор для коллекции, которая создается , в то время как вы итерируете ее и, возможно, не имеете конечного размера.
Например, у вас может быть генератор, который выплевывает простые числа от 2 до бесконечности. Нет никакого способа, которым вы могли бы иметь коллекцию «всех простых чисел» и перебирать ее с помощью итератора. Вам нужен генератор.
Или у вас может быть генератор, который принимает целое число и выдает факторы этого числа по одному за раз. Генератор здесь вам пригодится, так как вы можете исследовать факторы один за другим, не выделяя память для всех факторов заранее. Это также позволит вам использовать их по мере их генерирования, а не создавать весь список заранее, что может быть медленнее, чем вам нравится. Вот пример такого генератора в Python:
def factors(n):
for i in xrange(1, n+1):
if n % i == 0:
yield i
for n in factors(1234567890):
print n
Если вы запустите это, вы увидите напечатанные коэффициенты в том виде, в каком они рассчитаны. Нам не нужно фактически вести полный список всех факторов в памяти.