Генераторы это итерируемые объекты, которые можно прочитать лишь один раз. Это связано с тем, что они не хранят значения в памяти, а генерируют их на лету:

>>> mygenerator = (x*x for x in range(3))
>>> for i in mygenerator :
...    print(i)
0
1
4

Казалось бы, всего один раз можно пройти по данным. Зачем это?

На практике мы редко проходим по одним и тем же данным несколько раз. При этом нам не всегда нужны все данные. Например, стоит задача проверить что все элементы массива положительные. Вот мы пишем цикл, в котором сравниваем элементы с нулем. И бац, попадается отрицательный элемент. Можем уже дальше не проверять и уже кинуть ошибку. При этом весь массив не находится в памяти.

Это если обычные числа, а если элементы коллекции это результаты вычисления функции - вот как в коде выше, это квадраты. А элементов у нас не 3, а 1 миллион. А в данный момент нам нужны только первые 500, по ним определим нужны ли нам остальные. Вот здесь и приходят на помощь генераторы - они возвращают именно столько сколько и надо данных.



Комментарии