Основные конструкции языка Python


Цикл 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 есть итераторы, такие объекты-перечислители, у которых можно спросить какой элемент является следующим в объекте.
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)



Комментариев нет:

Отправить комментарий