GeneratorsΒΆ

Functions that yield a result are essentially an iterable:

def abc():
    yield "a"
    yield "b"
    yield "c"

When we have yield in a function, it implicitly becomes a “generator” which will act like an iterable:

>>> abc()
<generator object abc at 0x7fe30be0a8c0>
>>> for item in abc():
...     print item
...
a
b
c

>>> # We can do it again
>>> for item in abc():
...     print item
...
a
b
c
>>> # To see what's happening
>>> l = abc()
>>> l
<generator object abc at 0x7fe30be0a910>
>>> l.next()
'a'
>>> l.next()
'b'
>>> l.next()
'c'
>>> l.next()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

# Now let’s generate a sequence of unicode characters, equivalent to what we did in the Iterators section:

# NOTE: Many of these may not be visible characters
def make_unicode():
    for num in range(50, 1000):
        yield unichr(num)

for letter in make_unicode():
    print letter