Python Iterator Protocol

Python Iterator protocol

Any object in Python can be designed to hold multiple values and the values can be retrieved in an uniform manner i.e., one after another. An object that is designed to hold multiple values is generally called a container.

 

for element in CustomList:

    print(element)

   

The above for loop with the pattern,

 

        for <element> in <container>

 

is the standard way of retrieving values from any container in Python -  be it a container like list, dict from Python Standard Library or a user defined container like CustomList.

Iterator Object:

  • The iterator object in python is an object that has the __next__() method implemented.
  • On each call, the __next__() method returns a value from the iterable object.

Iterable Object:

  • If a developer wants to design containers whose values are accessible in the same python way as above,  then such container classes need to implement __iter__() method.
  • The __iter__() method returns an iterator object.
  • Thus any container with an __iter__() method is an Iterable Object in Python.

__next__() method:

  • On each invocation __next__() returns one value from the iterable/collection.
  • A StopIteration exception is raised when there are no more elements to be retrieved in the iterable object.

Example Container that implements python iterator protocol:

# Hashlist is both an iterable and an iterator in this example

class HashList:

    myData = []

    myPos  = 0

 

    def __init__(self, aData_in):

        self.myData = aData_in

   

    # Makes HashList an iterable 

    def __iter__(self):

        return self

 

    # Makes HashList an iterator

    def __next__(self):

        #hash the value before it is returned

        if self.myPos >= len(self.myData):

            raise StopIteration

 

        hashValue = hash(self.myData[self.myPos])

        self.myPos = self.myPos + 1

        return hashValue

       

       

HashListObject = HashList(["Two","Three","Five","Seven","Eleven"])

 

# print the hash list

for elem in HashListObject:

    print(elem)

 

Output:

-2240371794396141377

-4748626163865712805

-4847935018717398736

6822123111827422468

-52656924795627100

 


Copyright 2023 © pythontic.com