Шаг 62.
Python: сборник рецептов.
Итераторы и генераторы. Ручное прохождение по итератору

    На этом шаге мы рассмотрим реализацию такого прохождения.

Задача

    Вам нужно обработать элементы итерируемого объекта, но по какой-то причине вы не хотите использовать цикл.

Решение

    Чтобы вручную пройти по итерируемому объекту, используйте функцию 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
>>>

    Последующие рецепты раскрывают подробности о приемах итерирования, что предполагает знание базового протокола итераторов. Убедитесь, что этот первый рецепт прочно улегся у вас в памяти.

    На следующем шаге мы рассмотрим делегирование итерации.




Предыдущий шаг Содержание Следующий шаг