Iterator And Generator

Snippets about iterators and generators.

iterator - the Python yield keyword explained

Iterables:

>>> mylist = [x*x for x in range(3)]
>>> for i in mylist:
...    print(i)
0
1
4

Generators are iterators, but you can only iterate over them once. It’s because they do not store all the values in memory, they generate the values on the fly:

>>> mygenerator = (x*x for x in range(3))
>>> for i in mygenerator:
...    print(i)
0
1
4

Yield is a keyword that is used like return, except the function will return a generator:

>>> def createGenerator():
...    mylist = range(3)
...    for i in mylist:
...        yield i*i
...
>>> mygenerator = createGenerator() # create a generator
>>> print(mygenerator) # mygenerator is an object!
<generator object createGenerator at 0xb7555c34>
>>> for i in mygenerator:
...     print(i)
0
1
4

how do I determine if an object is iterable

Duck typing:

try:
    iterator = iter(theElement)
except TypeError:
    # not iterable
else:
    # iterable

Type checking, need at least Python 2.6 and work only for new-style classes:

import collections

if isinstance(theElement, collections.Iterable):
    # iterable
else:
    # not iterable