Правильная процедура доступа к файлам в бэкэнде

Объекты Iterator в python соответствуют протоколу итератора, что в основном означает, что они предоставляют два метода: __iter__() и next(). __iter__ возвращает объект итератора и неявно вызывается в начале циклов. Метод next() возвращает следующее значение и неявно вызывается при каждом приращении цикла. next() вызывает исключение StopIteration, когда больше нет значения для возврата, которое неявно захватывается конструкциями цикла, чтобы остановить итерацию.

Вот простой пример счетчика:

class Counter:
    def __init__(self, low, high):
        self.current = low
        self.high = high

    def __iter__(self):
        return self

    def next(self): # Python 3: def __next__(self)
        if self.current > self.high:
            raise StopIteration
        else:
            self.current += 1
            return self.current - 1


for c in Counter(3, 8):
    print c

Это будет печатать:

3
4
5
6
7
8

Это проще записать с использованием генератора, как описано в предыдущем ответе:

def counter(low, high):
    current = low
    while current <= high:
        yield current
        current += 1

for c in counter(3, 8):
    print c

Печатный вывод будет таким же. Под капотом объект-генератор поддерживает протокол итератора и делает что-то примерно похожее на класс Counter.

Статья Дэвида Мерца, Итераторы и простые генераторы - довольно хорошее введение.

0
задан Ben10 31 March 2019 в 00:44
поделиться