Теория
for запрашивает значения по одному
Мы много раз перебирали строки, списки и range. Все они итерируемые: у них можно попросить итератор. Итератор помнит текущую позицию и отдаёт следующее значение по запросу.
words = ["первое", "второе"]iterator = iter(words)print(next(iterator))print(next(iterator))Цикл for делает эти запросы сам и останавливается, когда значения закончились. Обычно ручные iter и next не нужны, но эта модель объясняет поведение генераторов и файлов.
Итератор хранит уже пройденный путь
- Первый next возвращает 10 и сдвигает позицию.
- Второй next возвращает 20.
- Третий запрос сообщает StopIteration: значений больше нет.
- Новый iter([10, 20]) создаст новый путь с начала.
Генератор вычисляет значение только к запросу
Функция с yield не собирает весь результат заранее. При каждом запросе она выполняется до следующего yield, отдаёт значение и сохраняет место остановки.
def even_numbers(limit): number = 0 while number <= limit: yield number number += 2 for number in even_numbers(6): print(number)Такой подход полезен, когда значений много или они появляются постепенно. Для небольшого готового набора обычный список часто проще.
Не каждая последовательность должна быть ленивой
- Нужен повторный проход? Готовая коллекция легко перебирается снова.
- Нужны все значения сразу? Список удобен для индексов, длины и сортировки.
- Значений много? Генератор может выдавать их постепенно.
- Назовите момент вычисления. yield откладывает работу до очередного запроса.
Практика
Назовите итерируемый объект
Строка «код» является итерируемым объектом; цикл получает из неё символы.
Получите следующее значение
Первый запрос возвращает первый элемент списка — 4.
Заметьте исчерпание
Итератор сообщает об окончании через StopIteration; for обрабатывает его автоматически.
Сохраните место генератора
yield выдаёт очередное значение и сохраняет состояние генератора.
Запустите генератор
Генератор выдаст 2, 4 и 6; следующее значение 8 превышает limit 7.
Итог
Теперь for не выглядит магией: он получает итератор и запрашивает значения, пока они не закончатся.
Генераторы остаются дополнительным инструментом. В следующих уроках важнее будет выбирать ясное решение, а не обязательно самое ленивое или короткое.
Прогресс
0 / 5Вы ещё не решали задания