Data Mastery
Data Mastery

Reputation: 2105

Python - inner workings of __iter__

I have got the following class:

class RandomNumbers:
    def __init__(self, length, *, range_min=0, range_max=10):
        self.length = length
        self.range_min = range_min
        self.range_max = range_max
        self.i = 0

    def __len__(self):
        return self.length

    def __next__(self):
        if self.i >= self.length:
            raise StopIteration
        number = random.randint(self.range_min, self.range_max)
        self.i += 1
        return number

    def __iter__(self):
        print("I was called")
        return self

This allows me to use a for-loop:

for number in RandomNumbers(10):
    print(number)

This works. When I comment out __iter__, I get the following error:

TypeError: 'RandomNumbers' object is not iterable

Ok, so far so good. I understand that I need the __iter__ method, but why is it needed when it actually only returns self?

Upvotes: 1

Views: 60

Answers (1)

Iain Shelvington
Iain Shelvington

Reputation: 32304

Your for loop could be rewritten as this somewhat equivalent code

it = iter(RandomNumbers(10))
while True:
    try:
        number = next(it)
    except StopIteration:
        break
    else:
        # Body of the for loop
        print(number)

Your class needs to implement the __iter__ method to respond to the iter() function with an iterator, in your case self since your class implements __next__ making it an iterator

Upvotes: 3

Related Questions