Найти тему
IT для всех

Python. Итераторы

Оглавление

Как работают Итераторы

Любая последовательность, такая как list, dict, sets, является итерируемой. То есть мы можем делать прогон по элементам. Например с помощью цикла For:

Но как это работает? Для итерируемых последовательностей существует метод iter(), который позволяет получить итератор.

А итератор в свою очередь имеет метод next() позволяющий получить следующий элемент.

Попробуем проитерировать список "руками". Для этого создадим итератор, который принимает в себя последовательность и выведем значения с помощью next():

-2

Но что произойдет, если попробовать вывести следующее значение, которого не существует, так как список кончился?

-3

Произойдет исключение:

StopIteration

Оно является командной для итератора, что нужно прекратить итерирование.

То есть, когда мы делаем прогон по элементам последовательности циклом For, то это равноценно циклу While, в котором исключение StopIteration обернуто в обработчик исключений и прекращает выполнение цикла:

-4

Свой собственный итератор

Можно создать собственный итератор. Для этого напишем класс RandomIterator, который будет выводить различные итерации случайного значения от 0 до 1 с помощью функции Random(не забываем импортировать модуль Random):

-5

В конструкторе прописываем количество итераций в качестве принимаемого значения и точку отсчета итераций, которая будет внутренней переменной класса и равна - 0.

Для того, чтобы наш итератор работал, в нём нужно также определить методы __iter__ и __next__, которые мы использовали выше:

-6

Метод __iter__ просто будет возвращать самого себя. А в методе __next__ уже пропишем условие прекращения итераций:

-7

Здесь мы сравниваем счетчик итераций с количеством переданного максимума итераций в объект класса.

Если счётчик меньше, увеличиваем его на 1 и возращаем значение.

Иначе, бросаем исключение StopIteration.

Теперь можно создать объект класса RandomIterator и проверить, что вышло:

-8

Этот итератор также можно прогнать как вручную, так и циклом For:

1. С помощью next:

-9

Причем объект iter создавать уже не нужно как в примере выше, так как наш класс уже является итератором.

-10

Наш итератор вывел 3 итерации и прекратил работу исключением.

2. С помощью цикла For:

-11

Что даёт 10 итераций, без ошибки, ведь как я написал ранее, прогон последовательностей учитывает остановку итерации с помощью обработчика исключений и исключения Stopiteration:

-12

Вот как-то так и работают итераторы в языке Python.