Перейти к основному содержимому

Итераторы в Python

Итератор можно представить как объект со счётным набором значений, которые можно перебирать по одному, пока вы не пройдёте их все.

Объект становится итератором в Python благодаря правилу, которое называется протоколом итератора: объект должен предоставлять два метода, __iter__() и __next__().


Итератор и итерируемый объект

Список, кортеж, словарь или множество — это итерируемый объект: контейнер, который может выдать вам итератор, когда вы его запросите.

Чтобы запросить итератор, передайте контейнер встроенной функции iter():

Пример

Получите итератор из кортежа, а затем выведите его значения по одному:
Prompt
Получите итератор из кортежа и выведите каждое значение с помощью iter() и next(). Создайте кортеж с "apple", "banana", "cherry".
Вывод: полная программа на Python

Пример

Строка работает так же, потому что это итерируемая последовательность символов:
Prompt
Переберите символы строки "banana" с помощью iter() и next(). Выведите каждый символ по одному.
Вывод: полная программа на Python

Перебор итератора в цикле

Цикл for — более короткий способ пройти по любому итерируемому объекту:

Пример

Переберите в цикле элементы кортежа:
Prompt
Переберите значения кортежа ("apple", "banana", "cherry") с помощью цикла for. Выведите каждое значение.
Вывод: полная программа на Python

Пример

Переберите строку в цикле, по одному символу за раз:
Prompt
Переберите символы строки "banana" с помощью цикла for. Выведите каждый символ.
Вывод: полная программа на Python

Создание итератора

Ваш собственный класс становится итератором, как только вы добавите в него оба метода: __iter__() и __next__().

В главе «Классы/объекты в Python» объясняется __init__() — функция, которая есть у каждого класса и нужна для подготовки в момент создания объекта.

__iter__() играет похожую роль: он может выполнять подготовительную работу, но возвращать всегда должен сам объект-итератор.

__next__() тоже может выполнять операции, и каждый его вызов должен возвращать следующий элемент последовательности.

Пример

Создайте итератор, который считает вверх от 1, прибавляя единицу на каждом шаге (1, 2, 3, 4, 5 и так далее):
Prompt
Создайте класс MyNumbers, который реализует __iter__() и __next__(). Итератор возвращает числа, начиная с 1, каждый раз увеличивая значение на единицу. Выведите первые 5 значений с помощью next().
Вывод: полная программа на Python

StopIteration

Итератор из предыдущего примера ничто не останавливает: при достаточном количестве вызовов next() или внутри цикла for он никогда бы не закончился.

Завершить его позволяет исключение StopIteration.

Добавьте в __next__() условие, которое вызывает это исключение, когда итерация выполнится нужное вам количество раз:

Пример

Завершите итерацию после 20 значений:
Prompt
Создайте класс MyNumbers с методами __iter__() и __next__(), который возвращает числа от 1 до 20. Используйте StopIteration, чтобы остановиться после 20 итераций. Выведите все значения с помощью цикла for.
Вывод: полная программа на Python