Как работают Итераторы
Любая последовательность, такая как list, dict, sets, является итерируемой. То есть мы можем делать прогон по элементам. Например с помощью цикла For:
Но как это работает? Для итерируемых последовательностей существует метод iter(), который позволяет получить итератор.
А итератор в свою очередь имеет метод next() позволяющий получить следующий элемент.
Попробуем проитерировать список "руками". Для этого создадим итератор, который принимает в себя последовательность и выведем значения с помощью next():
Но что произойдет, если попробовать вывести следующее значение, которого не существует, так как список кончился?
Произойдет исключение:
StopIteration
Оно является командной для итератора, что нужно прекратить итерирование.
То есть, когда мы делаем прогон по элементам последовательности циклом For, то это равноценно циклу While, в котором исключение StopIteration обернуто в обработчик исключений и прекращает выполнение цикла:
Свой собственный итератор
Можно создать собственный итератор. Для этого напишем класс RandomIterator, который будет выводить различные итерации случайного значения от 0 до 1 с помощью функции Random(не забываем импортировать модуль Random):
В конструкторе прописываем количество итераций в качестве принимаемого значения и точку отсчета итераций, которая будет внутренней переменной класса и равна - 0.
Для того, чтобы наш итератор работал, в нём нужно также определить методы __iter__ и __next__, которые мы использовали выше:
Метод __iter__ просто будет возвращать самого себя. А в методе __next__ уже пропишем условие прекращения итераций:
Здесь мы сравниваем счетчик итераций с количеством переданного максимума итераций в объект класса.
Если счётчик меньше, увеличиваем его на 1 и возращаем значение.
Иначе, бросаем исключение StopIteration.
Теперь можно создать объект класса RandomIterator и проверить, что вышло:
Этот итератор также можно прогнать как вручную, так и циклом For:
1. С помощью next:
Причем объект iter создавать уже не нужно как в примере выше, так как наш класс уже является итератором.
Наш итератор вывел 3 итерации и прекратил работу исключением.
2. С помощью цикла For:
Что даёт 10 итераций, без ошибки, ведь как я написал ранее, прогон последовательностей учитывает остановку итерации с помощью обработчика исключений и исключения Stopiteration:
Вот как-то так и работают итераторы в языке Python.