PythonIterators
Python Iterators
An iterator is an object that contains a countable number of values.
An iterator is an object that can be iterated upon, meaning that you can traverse through all the values.
Technically, in Python, an iterator is an object which implements the iterator protocol, which consist of the methods__iter__()
and__next__()
.
Iterator vs Iterable
Lists, tuples, dictionaries, and sets are all iterable objects. They are iterablecontainers which you can get an iterator from.
All these objects have aiter()
method which is used to get an iterator:
Example
Return an iterator from a tuple, and print each value:
myit = iter(mytuple)
print(next(myit))
print(next(myit))
print(next(myit))
Even strings are iterable objects, and can return an iterator:
Example
Strings are also iterable objects, containing a sequence of characters:
myit = iter(mystr)
print(next(myit))
print(next(myit))
print(next(myit))
print(next(myit))
print(next(myit))
print(next(myit))
Looping Through an Iterator
We can also use afor
loop to iterate through an iterable object:
Example
Iterate the values of a tuple:
for x in mytuple:
print(x)
Example
Iterate the characters of a string:
for x in mystr:
print(x)
Thefor
loop actually creates an iterator object and executes thenext()
method for each loop.
Create an Iterator
To create an object/class as an iterator you have to implement the methods__iter__()
and__next__()
to your object.
As you have learned in thePython Classes/Objects chapter, all classes have a function called__init__()
, which allows you to do some initializing when the object is being created.
The__iter__()
method acts similar, you can do operations (initializing etc.), but must always return the iterator object itself.
The__next__()
method also allows you to do operations, and must return the next item in the sequence.
Example
Create an iterator that returns numbers, starting with 1, and each sequence will increase by one (returning 1,2,3,4,5 etc.):
def __iter__(self):
self.a = 1
return self
def __next__(self):
x = self.a
self.a += 1
return x
myclass = MyNumbers()
myiter = iter(myclass)
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
StopIteration
The example above would continue forever if you had enough next() statements, or if it was used in afor
loop.
To prevent the iteration from going on forever, we can use theStopIteration
statement.
In the__next__()
method, we can add a terminating condition to raise an error if the iteration is done a specified number of times:
Example
Stop after 20 iterations:
def __iter__(self):
self.a = 1
return self
def __next__(self):
if self.a <= 20:
x = self.a
self.a += 1
return x
else:
raise StopIteration
myclass = MyNumbers()
myiter = iter(myclass)
for x in myiter:
print(x)