Найти в Дзене
Native coder

Итераторы в Python

Всем привет, сегодня мы познакомимся с понятием итераторов и узнаем как их применять с помощью языка Python.
1) Iterable и iterator
В английском языке есть понятие to iterate, что означает перебирать. Слово итерация можно интерпретировать как перебор элементов. Самым простым примером итерации в Python является цикл for. Например, выполнив следующую программу:
num_list = [1, 2, 3]
Оглавление

Всем привет, сегодня мы познакомимся с понятием итераторов и узнаем как их применять с помощью языка Python.

1) Iterable и iterator

В английском языке есть понятие to iterate, что означает перебирать. Слово итерация можно интерпретировать как перебор элементов. Самым простым примером итерации в Python является цикл for. Например, выполнив следующую программу:

num_list = [1, 2, 3]
for num in num_list:
print(num)

мы получим на выходе все элементы списка на новой строке:

>>>
1
2
3

Эта запись означает, что для каждого элемента в списке мы выполняем определённое действие, в данном случае - итерацию.

Объекты в Python могут перебираемыми и неперебираемыми, то есть iterable и not iterable. Например, переменная типа integer неперебираема, а вот список - да. Но помимо этих двух видов, объекты также могут сами перебирать другие объекты, как, например, это делает цикл for, то есть быть итератором(iterator).

2) Применение итераторов

Для того, чтобы понять как работают итераторы, нужно создать новую переменную и поместить в неё функцию iter, которая принимает один параметр - перебираемый объект. Если мы выведем на экран тип этой переменной то получим следующий ответ:

num_list = [1 , 2 , 3 ]
num_list_iter = iter (num_list)
print (type (num_list_iter))
>>> <class 'list_iterator'>

Итератор имеет специальный метод __next__ , который переходит к следующему элементу. Так, если в нашем примере мы вызовем команду

print(num_list_iter.__next__())

То получим на выводе первый элемент списка. Но если мы введём этот метод большее количество раз, чем имеется элементов в списке, то получим ошибку StopIteration.

Альтернативой специальному методу служит функция next(), в которую в качестве параметра мы передадим наш итератор. Так выглядит эта программа в оптимальном виде.

-2

Но так мы никогда не переберём переменную корректно, если не будем знать его длину. Для того, чтобы исправить это, нужно создать функцию, которая будет корректно перебирать элементы. В ней мы будем использовать конструкцию try-except.

В условие except можно добавить функцию print, которая будет сообщать нам "Итерация завершена!"
В условие except можно добавить функцию print, которая будет сообщать нам "Итерация завершена!"

3) Создание собственного итератора

Для создания своего итератора нужно создать новый класс, который будет называться MyRange. В функции __init__ передаём 2 параметра: start, end. Значение end присваиваем переменной self.end, а start - переменным self.start и self.current (current - текущий).

В функции __iter__ возвращаем значением self.

В функции __next__ проверяем, что текущее значение меньше наибольшего. Если условие выполняется, то создаём переменную num, присваиваем ей значение переменной self.current, а саму переменную с текущим значением увеличиваем на один. После чего возвращаем num.

Если итерация закончится, то внизу строчка raise StopIteration (то есть выбросить ошибку StopIteration) не позволит запуститься бесконечному циклу.

-4

Код программы с проверкой на переменной:

class MyRange:

def __init__ (self , start, end):
self .start = start
self .end = end
self .current = start

def __iter__ (self ):
return self

def __next__ (self ):
if self .current < self .end:
num = self .current
self .current += 1
return num
raise StopIteration


example_range = MyRange(0 , 10 )
for num in example_range:
print (num)