Iterators and Generators

 Iterators

An iterator is an object that can be iterated.

Iterator return only one element at a time.

Iteator has 2 special methods:

1.__iter__()

                     Returns the iterator object


2.__next__()

                     Returns the current item.

                     Move to the next iteration.



Example

L=iter([10,20]) #iter()

#print(L.__next__())

print(next(L))

print(next(L))

print(next(L)) #stopIteration Error




Example2

Make an iterator of 2 power values upto 5

(2^0  2^1  2^2  2^3 2^4  2^5)


class PowerTwo:


    def __init__(self,max):

        self.max=max


    def __iter__(self):

        self.n=0

        return self


    def __next__(self):

        if self.n<=self.max: #0<=5  1<=5  2<=5 ...5<=5  6<=5

            result=2**self.n #2^0   2^1   2^2     2^5

            self.n=self.n+1

            return result

        else:

            raise StopIteration


    def iter(self):

        return self.__iter__()


    def next(self):

        return self.__next__()

        

obj=iter(PowerTwo(5))

#print(obj.__next__())

print(obj.next())

print(obj.next())

print(obj.next())

print(obj.next())

print(obj.next())

print(obj.next())



print("Using for loop, ")

for i in obj:

    print(i)




Example2

"""

Make an iterator that returns even numbers from 0 to 10

"""

class Evens:

    max=None

    n=None

    def __init__(self,max):

        self.max=max


    def __iter__(self):

        self.n=0

        return self


    def __next__(self):

        if self.n<=self.max:

            if self.n%2==0:

                result=self.n  

                self.n=self.n+1  

                return result   

            else:

                self.n=self.n+1  

                return ""            

        else:

            raise StopIteration


    def iter(self):

        return self.__iter__()


    def next(self):

        return self.__next__()

        


for i in Evens(10):

    print(i)




Generators

Generator is an alternative to iterator.

No need to write iter() and next() implementation while using generator.


It has one or more yield statement which returns value from generators.


Advantages

  • Easy to implement compared to iterators.
  • Genearators are memory efficient.
  • These are excellent medium to represent infinite stream of data.





#Generator generating powers of 2 upto 5

def powTwo(max):

    n=0

    while n<=max:

        yield 2**n

        n=n+1


i=iter(powTwo(5))

print(next(i))

print(next(i))

print(next(i))

print(next(i))

print(next(i))

print(next(i))


print("Using for loop,")

for item in powTwo(5):

    print(item)





Comments

Popular posts from this blog

Solving maze puzzle in python