What is a generator?
A generator is a special kind of function that returns an iterator. It looks like a normal function, but values are returned to the caller using a yield statement instead of a return statement. When yield is called, the function is suspended and the yielded value is returned to the caller. The function is then resumed again the next time the caller asks for another value.
>>> def gen(): ... yield 1 ... yield 2 ... for each in (3,4,5): ... yield each ... >>> for val in gen(): ... print val ... 1 2 3 4 5 >>> sum(gen()) 15 >>> [str(i) for i in gen()] ['1', '2', '3', '4', '5']
You can also fetch values from a generator
by hand. When you call
a generator function, it returns a special
generator object, and
then immediately suspends itself. To run the generator, call its
>>> x = gen() >>> x <generator object at 0x00AE63F0> >>> x.next() 1 >>> x.next() 2 >>> x.next() 3 >>> x.next() 4 >>> x.next() 5
When the generator is exhausted, it raises a StopIteration exception:
>>> x.next() Traceback (most recent call last): File "<stdin>", line 1, in ? StopIteration
You can also create a generator using a generator expression that returns a generator. Like a list comprehension, a generator expression looks like a normal expression followed by a for expression defining a loop variable, a range or another iterable to loop over, and an optional if expression. The combined expression generates values for an enclosing function:
>>> sum(i*i for i in range(10)) # sum of squares 0, 1, 4, ... 81 285 >>> x = (i*i for i in range(4)) >>> x.next() 0 >>> x.next() 1 >>> x.next() 4 >>> x.next() 9 >>> x.next() Traceback (most recent call last): File "<stdin>", line 1, in ? StopIteration
Note that generator expressions must be written inside parentheses, but the extra parentheses can be left out when the expression is the sole argument to a function (as in the sum call in this example).
CATEGORY: general programming