Цикл for и итераторы
lst = [1, 2, 3, 4, 5, 6] book = { 'title': 'The Langoliers', 'author': 'Stephen King', 'year_published': 1990 } string = "Hello, World!" for i in lst: # перебираем элементы списка print(i) for i in book: # перебираем ключи словаря print(i) for i in string: # перебираем символы строки print(i)
В языке Python есть итераторы, такие объекты-перечислители, у которых можно спросить какой элемент является следующим в объекте.
Если мы хотим перебирать элементы какого-нибудь объекта с помощью цикла for, то у этого объекта должен быть итератор. Если в объекте кончились элементы, то итератор должен бросить ошибку StopIteration.
Именно таким образом и работает цикл for.
Для того чтобы объект можно было проитерировать, т.е. перечислить его элементы, у него должен быть определен метод iter, который возвращает итератор. А для того чтобы объект являлся итератором у него должен быть определен метод next.
Пример итератора перебирающего пары элементов:
iterator = iter(book) print(next(iter))
Если мы хотим перебирать элементы какого-нибудь объекта с помощью цикла for, то у этого объекта должен быть итератор. Если в объекте кончились элементы, то итератор должен бросить ошибку StopIteration.
Именно таким образом и работает цикл for.
it = iter(book) while True: try: i = next(it) print(i) except StopIteration: break;
Для того чтобы объект можно было проитерировать, т.е. перечислить его элементы, у него должен быть определен метод iter, который возвращает итератор. А для того чтобы объект являлся итератором у него должен быть определен метод next.
from random import random class RandomIterator: def __init__(self, k): # конструктор self.k = k self.i = 0 def __next__(self): # объект является итератором, когда у него есть данный метод if self.i < self.k: self.i += 1 return random() else: raise StopIteration def __iter__(self): return self x = RandomIterator(3) print(next(x)) # next(x) ~ x.__next__() print(next(x)) print(next(x)) for y in RandomIterator(10): print(y)
Пример итератора перебирающего пары элементов:
class DoubleElementListIterator: def __init__(self, lst): self.lst = lst self.i = 0 def __next__(self): if self.i < len(self.lst): self.i += 2 return self.lst[self.i - 2], self.lst[self.i - 1] else: raise StopIteration class MyList(list): def __iter__(self): return DoubleElementListIterator(self) for pair in MyList([1, 2, 3, 4]): print(pair)
Комментариев нет:
Отправить комментарий