all Python 3Iterators & generatorsterm
Iterator protocol
iterator protocol
An iterator is an object with __iter__ and __next__. __next__ returns the next value or raises StopIteration.
Syntax
class Iter:
def __iter__(self): return self
def __next__(self): ...
Do not confuse an iterable with an iterator: a list can be traversed any number of times, an iterator exactly once, and once exhausted it must keep raising StopIteration rather than restarting. That is why a class whose __iter__ returns self silently produces nothing in a second for loop; to make the object reusable, __iter__ should hand back a fresh iterator object each time.
Examples
class CountUp:
def __init__(self, start, stop):
self.current = start
self.stop = stop
def __iter__(self):
return self
def __next__(self):
if self.current >= self.stop:
raise StopIteration
val = self.current
self.current += 1
return val
for x in CountUp(1, 4):
print(x, end=' ') # → 1 2 3
class Squares:
def __init__(self, n):
self.i = 0; self.n = n
def __iter__(self): return self
def __next__(self):
if self.i >= self.n: raise StopIteration
val = self.i**2
self.i += 1
return val
print(list(Squares(5))) # → [0,1,4,9,16]
# Итератор — одноразовый!
it = iter([1,2,3])
print(list(it)) # → [1,2,3]
print(list(it)) # → [] исчерпан!
class FibIter:
def __init__(self, max_n):
self.a, self.b = 0, 1
self.max_n = max_n
def __iter__(self): return self
def __next__(self):
if self.a > self.max_n: raise StopIteration
val = self.a
self.a, self.b = self.b, self.a+self.b
return val
print(list(FibIter(50))) # → [0,1,1,2,3,5,8,13,21,34]
# for цикл использует __iter__/__next__
lst = [10, 20, 30]
it = iter(lst)
while True:
try:
print(next(it))
except StopIteration:
break # → 10 20 30
class Reversed:
def __init__(self, data):
self.data = data
self.i = len(data) - 1
def __iter__(self): return self
def __next__(self):
if self.i < 0: raise StopIteration
val = self.data[self.i]
self.i -= 1
return val
print(list(Reversed([1,2,3,4]))) # → [4,3,2,1]
See also
Open in the full glossarydocs.python.orgReport an inaccuracy