Итераторы Python — функциональность и использование с первого взгляда

Ведение журнала Python Изучение

Итераторы 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. Это гарантирует, что указатель сдвинется на один символ, так что «объект итератора» будет указывать на первую букву строки символов после вызова функции.

Читайте также:  Путь к успеху 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 вызывает ошибку.

Оцените статью
Блог о программировании
Добавить комментарий