Выражения-генераторы – напоминают генераторы списков (List Comprehensions) , но результатом будет являться уже не список, а объект, который будет воспроизводить результаты по требованию - генератор.
Визульано выражение-генератор отличается от генератора списка скобками. Выражение-генератор заключается в круглые скобки, а генератор списка - в квадратные.
>>> [i**2 for i in range(1,6)] #Генератор списка
[1,4,9,16,25]
>>> (i**2 for i in range(1,6)) #Выражение генератор
generator object at 0x0066A030
Теперь давайте разберемся в определениях
Генератор - это итератор, элементы которого можно итерировать(обходить поэлементно) только один раз.
Итератор - объект, который поддерживает функцию next(). Помнит о том, какой элемент будет браться следующим.
Итерируемый объект - объект, который предоставляет возможность обойти поочередно свои элементы. Может быть преобразован к итератору.
Раз генератор является итератором мы можем к нему применять функцию next(). При каждом новом вызове функции next() генератор будет нам выдавать следующий элемент коллекции. Если вызвать next() больше раз чем элементов внутри генератора, получим исключение StopIteration.
Также генератор можно обойти при помощи цикла for, но только один раз.
Не зыбывайте, что такие встроенные функции как sum делают неявный обход коллекции во время своей работы. Поэтому после первого вызова функции sum() в примере ниже генератор стал пустым.