Итераторы Python — это объекты Python со счетным набором элементов, которые реализуют протокол итератора, состоящий из двух функций __iter__() и __next__().
Что такое итераторы Python?
Итераторы Python — это прежде всего особая форма объектов Python. Они характеризуются тем, что состоят из набора счетных элементов. Таким образом, вы можете подсчитывать элементы итератора и перебирать все элементы итератора Python.
Итераторы против итераторов
Итераторы Python не следует путать с итерируемыми объектами Python. Однако итератор и итерируемый объект тесно связаны. Отличительной чертой различных итерируемых объектов, таких как список Python, является то, что они имеют метод __iter__() и, таким образом, позволяют выполнять итерацию по ним. Как правило, вы можете помнить : все, что находится справа от заголовка цикла при вызове цикла for, является итерируемым.
l = [1, 2, 3] for x in l: print(x)
Как видите, список, хранящийся в переменной «l», появляется в вызове цикла Python for справа от заголовка цикла после ключевого слова «in» и, следовательно, является итерируемым.
Из итерируемого объекта вы можете получить итератор Python. Пример кода помогает прояснить это и понять различия:
string = "test" iteratorobjekt = iter(string) next(iteratorobjekt) iter(iteratorobjekt)
Во-первых, строка Python со значением «test» сохраняется в переменной с именем «string» в коде. Строки также попадают в категорию итерируемых, поскольку вы можете перебирать каждую букву строки.
Тот факт, что вы можете перебирать строки, по существу означает, что строка также поддерживает функцию __iter__(). Вы можете увидеть это в следующей строке кода, где мы создаем итератор Python, вызывая функцию iter вместе со строкой, которую мы создали ранее. Это возвращает указатель на строки и сохраняет его в переменной с именем iterator object. Итак, итератор Python находится в состоянии. Мы можем изменить это состояние, вызвав метод __next__() в итераторе Python. Это гарантирует, что указатель сдвинется на один символ, так что «объект итератора» будет указывать на первую букву строки символов после вызова функции.
Вызов функции __iter__(), которая принимает итератор Python в качестве дополнительного параметра, возвращает ссылку на него. Таким образом, итераторы Python являются самоповторяющимися.
Итераторы против генераторов
Также важно отличать итераторы от генераторов Python. Хотя каждый генератор в Python также является итератором, обратное неверно. В отличие от генератора, итератор не обязательно формируется с помощью функции, содержащей выражение yield.
Для чего и почему используются итераторы Python?
Основное использование итераторов — это, конечно же, итерация.Большое преимущество итераторов в Python в том, что они работают по принципу » ленивых вычислений «. Другими словами, с каждым элементом итератора Python можно манипулировать по отдельности, не загружая всю структуру данных в память. Такое поведение повышает эффективность, особенно при больших объемах данных, когда в любой момент времени необходимо загрузить только один элемент.
Как создавать итераторы Python
Создать собственный итератор Python несложно. Все, что вам нужно сделать, это добавить функции __iter__() и __next__() к объекту Python. Вот как вы можете легко создать итератор, который возвращает все четные числа. Пример кода показывает, как именно это работает:
class geradeZahlen: def __iter__(self): self.x = 0 return self def __next__(self): a = self.x self.x += 2 return a testobjekt = geradeZahlen() testiterator = iter(testobjekt) print(next(testiterator)) print(next(testiterator)) print(next(testiterator)) print(next(testiterator))
Чтобы реализовать итератор Python, сначала создается класс, который носит здесь имя «EvenNumbers». Внутри класса две функции __iter__() и __next__() реализованы с желаемым поведением.
В нашем случае функция __iter__() просто возвращает ссылку на итератор, который должен содержать последовательность целых чисел, начинающуюся с 0. Логика итерации, то есть выводится только каждую секунду и, следовательно, каждое четное число, находится внутри функции __next__().
После определения класса создается объект класса, который сохраняется в переменной с именем «testobject». Объект становится итератором Python, вызывая функцию iter(), как мы показали в предыдущем примере кода. Затем следуют четыре вызова next(), результаты которых выводятся на экран. Вывод приведенного выше раздела кода выглядит следующим образом:
0 2 4 6
Ограничение итераторов Python
Итератор, перебирающий четные числа, будет работать до бесконечности без ограничений, как и набор четных чисел. Этого можно избежать, используя оператор StopIteration в сочетании с оператором if-else в Python. Например, если вы хотите вывести все четные числа до 100 включительно в своем итераторе Python, вам необходимо адаптировать приведенный выше пример кода следующим образом:
class geradeZahlen: def __iter__(self): self.x = 0 return self def __next__(self): if self.x <= 100: a = self.x self.x += 2 return a else: StopIteration testobjekt = geradeZahlen() testiterator = iter(testobjekt) print(next(testiterator)) print(next(testiterator)) print(next(testiterator)) print(next(testiterator))
В коде ничего не изменилось, кроме реализации функции __next__(). Здесь реализован дополнительный оператор if-else, который проверяет, меньше или равно ли текущее число 100, и продолжает перебирать набор четных чисел только при этом условии. Если число превышает 100, вызов StopIteration вызывает ошибку.








