13. Итераторы.
- Итератор - объект, имеющий метод next() и реализующий корректное поведение при его использовании.
- Метод next() должен иметь следующую семантику: вернуть текущий объект, а следующий сделать текущим.
- Если текущего объекта нет, то вызвать исключение StopIteration.
class SomeIter(object):
def __iter__(self):
return self
def next(self):
raise StopIteration()
print [val for val in SomeIter()]
class ContainerIter(object):
def __init__(self, cont):
self.cont = cont
def next(self):
raise StopIteration()
class Container(object):
def __iter__(self):
return ContainerIter(self)
print [val for val in Container()]
Цикл for и итерирование
- for вызывает функцию iter(obj) от переданного ему объекта после ключевого слова in.
- В результате вызова должен быть получен объект итератор.
- Далее for использует next(), пока не будет вызвано исключение StopIteration.
- Чтобы добавить в свой класс возможность итерирования по нему следует определить магический метод
__iter__
так, чтобы он возвращал итератор.
- Таким образом, мы теперь можем называть объект iterable, когда в нём дана возможность получения итератора и итерирования.
- Кроме этого, объект ещё iterable, когда у него есть
__getitem__
способный принимать последовательные индексы начиная с 0 и бросающий IndexError при окончании промежутка (так у строк).