На этом шаге мы рассмотрим реализацию такого прохождения.
Вам нужно обработать элементы итерируемого объекта, но по какой-то причине вы не хотите использовать цикл.
Чтобы вручную пройти по итерируемому объекту, используйте функцию next() и напишите код так, чтобы он ловил исключение StopIteration. Например, в этом случае мы вручную читаем строки из файла:
with open('/etc/passwd') as f: try: while True: line = next(f) print(line, end='') except StopIteration: pass
Обычно StopIteration используется для передачи сигнала о конце итерирования. Однако если вы используете next() вручную, вы вместо этого можете запрограммировать возвращение конечного значения, такого как None. Например:
with open('/etc/passwd') as f: while True: line = next(f, None) if line is None: break print(line, end='')
В большинстве случаев для прохода по итерируемому объекту используется цикл for. Однако задачи иногда требуют более точного контроля лежащего в основе механизма итераций. Также это полезно, для того чтобы разобраться, как он работает.
Следующий интерактивный пример иллюстрирует базовые механизмы того, что происходит во время итерирования:
>>> items = [1, 2, 3] >>> # Получаем итератор >>> # Вызываем items.__iter__() >>> it = iter(items) >>> # Запускаем итератор >>> # Вызываем it.__next__() >>> next(it) 1 >>> next(it) 2 >>> next(it) 3 >>> next(it) Traceback (most recent call last): . . . . next(it) StopIteration >>>
Последующие рецепты раскрывают подробности о приемах итерирования, что предполагает знание базового протокола итераторов. Убедитесь, что этот первый рецепт прочно улегся у вас в памяти.
На следующем шаге мы рассмотрим делегирование итерации.