What is the most basic definition of "iterable", "iterator" and "iteration" in Python?
I have read multiple definitions but I am unable to identify the exact meaning as it still won't sink in.
Can someone please help me with the 3 definitions in layman terms?
Iteration is a general term for taking each item of something, one after another. Any time you use a loop, explicit or implicit, to go over a group of items, that is iteration.
In Python, iterable and iterator have specific meanings.
An iterable is an object that has an
__iter__ method which returns an iterator, or which defines a
__getitem__ method that can take sequential indexes starting from zero (and raises an
IndexError when the indexes are no longer valid). So an iterable is an object that you can get an iterator from.
An iterator is an object with a
next (Python 2) or
__next__ (Python 3) method.
Whenever you use a
for loop, or
map, or a list comprehension, etc. in Python, the
next method is called automatically to get each item from the iterator, thus going through the process of iteration.
A good place to start learning would be the iterators section of the tutorial and the iterator types section of the standard types page. After you understand the basics, try the iterators section of the Functional Programming HOWTO.
Here's the explanation I use in teaching Python classes:
An ITERABLE is:
for x in iterable: ...or
iter()that will return an ITERATOR:
__iter__that returns a fresh ITERATOR, or it may have a
__getitem__method suitable for indexed lookup.
An ITERATOR is an object:
__iter__method that returns
__next__method in Python 3 is spelt
nextin Python 2, and
next()calls that method on the object passed to it.
>>> s = 'cat' # s is an ITERABLE # s is a str object that is immutable # s has no state # s has a __getitem__() method >>> t = iter(s) # t is an ITERATOR # t has state (it starts by pointing at the "c" # t has a next() method and an __iter__() method >>> next(t) # the next() function returns the next value and advances the state 'c' >>> next(t) # the next() function returns the next value and advances 'a' >>> next(t) # the next() function returns the next value and advances 't' >>> next(t) # next() raises StopIteration to signal that iteration is complete Traceback (most recent call last): ... StopIteration >>> iter(t) is t # the iterator is self-iterable