Минимальный пример:squares = (x ** 2 for x in range(5)); for num in squares: print(num).
Топ-3 ошибки: повторное использование исчерпанного итератора, вызов next() на списке, ожидание индексации генератора как списка.
О чём этот урок
В этом уроке вы узнаете, как Python умеет перебирать коллекции поэлементно без загрузки всех значений в память сразу. Мы разберём протокол итерации, встроенные функции iter() и next(), исключение StopIteration и работу цикла for «под капотом».
Также познакомимся с модулем itertools — набором эффективных инструментов для построения и комбинирования итераторов — и с генераторными выражениями, которые заменяют промежуточные списки ленивыми вычислениями.
Эти знания пригодятся при обработке больших файлов, чтении данных из сети, построении конвейеров обработки и оптимизации памяти.
Цели
Отличать итерируемый объект от итератора.
Создавать итераторы через iter() и получать элементы через next().
Понимать роль __iter__() и __next__() в протоколе итерации.
Обрабатывать конец последовательности с помощью StopIteration и значения по умолчанию в next().
Использовать itertools для бесконечных последовательностей, объединения и декартова произведения.
Создавать и применять генераторные выражения для экономии памяти.
Сравнивать потребление памяти списков и генераторов через sys.getsizeof().