6.8 The yield statement

The yield statement is only used when defining a generator
function, and is only used in the body of the generator function.
Using a yield statement in a function definition is
sufficient to cause that definition to create a generator function
instead of a normal function.

When a generator function is called, it returns an iterator known as a
generator iterator, or more commonly, a generator. The body of the
generator function is executed by calling the generator's
next() method repeatedly until it raises an exception.

When a yield statement is executed, the state of the
generator is frozen and the value of expression_list is
returned to next()'s caller. By ``frozen'' we mean that all
local state is retained, including the current bindings of local
variables, the instruction pointer, and the internal evaluation stack:
enough information is saved so that the next time next() is
invoked, the function can proceed exactly as if the yield
statement were just another external call.

The yield statement is not allowed in the try
clause of a try ... finally construct. The
difficulty is that there's no guarantee the generator will ever be
resumed, hence no guarantee that the finally block will ever
get executed.

Note:
In Python 2.2, the yield statement is only allowed
when the generators feature has been enabled. It will always
be enabled in Python 2.3. This __future__ import statment can
be used to enable the feature: