Iterators

__iter__ , __next__ : inside functionning of iterators

Behind the for loop is actually a call of the __iter__ special function of the list object. This functions can be called with iter, and returns an iterator object.

To get the next item from an iterator call the next function, which actually calls the __next__ special method.

When creating a custom object, we have to create the __iter__ and __next__ functions to make it iterable.

So this :

list = [12, 5, 6, 87, 9]

sum = 0
for i in list:
    sum += i

Is equivalent to this :

list = [12, 5, 6, 87, 9]

list_iter = iter(list)
while True:
    try:
        sum += next(list_iter)
    except StopIteration:
        break

Create generators with yield

yield must be used exclusively inside a function (or class method). The principle is : each time the interpreter reaches a yield keyword, it returns the value that follows it and pauses, until another next function is called.

Here is an example of a generator using yield :

def interval(lim_low, lim_high):
        """Generator that returns the series of integers
        starting at lim_low and ending at lim_high."""

        while lim_low <= lim_high:
            yield lim_low
            lim_low += 1

Use :

my_iterator = iter(interval(3, 8))

i = 3
while True:
    try:
        print(next(my_iterator))
        i += 1
    except StopIteration:
        break

TO BE FINISHED