Generators, Iteratos - AndrewMZ6/python_cheat_sheet GitHub Wiki

First of all - every generator is iterator while not every iterator is generator!

Second of all - iterators and iterable objects are not the same. Iterable objects are objects that can be converted into iterators. For this to hapen they must have __iter__ method to be defined, and when it gets called iterables turn into iterators.

Iterators have __iter__ method defined also but when called it returns the iterator itself. The main difference is that iterators have __next__ method defined and when called it returns current value of sequence, changes the current value so next time the __next__ method gets called iterator returns new value.

Generators return value with yield instruction

For example let's consider a list

L = [1, 2, 3]

If we try to pass it to next() inbuilt function

next(L)

we get error that says that list L is not an iterator!

Traceback (most recent call last):
  File "E:\Code\Python\test19.py", line 3, in <module>
    next(L)
TypeError: 'list' object is not an iterator

now let's check what names are defined in list's scope

print(L.__dir__())

output

['some other names', ..., '__iter__', ... ,'some other names']

We can see that there's __iter__ method so let's use iter() function

iter_L = iter(L)

and try to call the next element

next(iter_L)
next(iter_L)
next(iter_L)
next(iter_L)

output

1
2
3
Traceback (most recent call last):
  File "E:\Code\Python\test19.py", line 9, in <module>
    print(next(iter_L))
StopIteration
⚠️ **GitHub.com Fallback** ⚠️