В чем разница между итератором и генератором?
Опубликовано 29 February 2016 в Python
Как ни странно, вопрос о разнице между генераторами и итераторами в Python - довольно частый вопрос. В общем-то эти сущности сильно связаны (любой генератор - это итератор), их довольно часто путают, что иногда приводит к недопониманиям.
Итератор - более общая концепция. Это объект, у которого определены два метода __next__ и __iter__.
С другой стороны, генератор - это итератор. Но не наоборот. Генератор может получаться использованием yield в теле функции.
def squares(start, stop):
for i in range(start, stop):
yield i * i
generator = squares(a, b)
Либо использованием так называемых generator expression. На вроде такого:
generator = (i*i for i in range(a, b))
Если посмотреть dir(generator) и в первом и во втором случае, то обнаружим, что оба варианта - итераторы (определены функции __next__ и __iter__).
По большому счету генераторы - это синтаксический сахар. И без них можно писать такие же эффективные программы используя только итераторы. Вот только читаемость и простота кода сильно снизятся. Так что, если не нужно от итератора ничего сверх естественного, то стоит подумать над использованием генератора.
В примерах и объяснениях я использовал Python 3. Для второй версии языка есть незначительные отличия.
Возник вопрос? Мне всегда можно написать в Twitter: avkorablev