6.8 yield语句 The yield statement

yield_stmt  ::=  "yield" expression_list
Download entire grammar as text.

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.

yield语句不允许出现于try ... finally结构的try子句当中。困难之处在于没有保证generator会被继续执行,于是也就没有保证finally块会被执行。

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:

注意:在Python 2.2,yield语句只有在生成器特性被激活以后才成立。在Python 2.3中它将总是激活的。下面这个__future__ import语句可用于激活该特性:

from __future__ import generators

See Also:

PEP 0255, 简单生成器 Simple Generators
为Python添加生成器和yield语句的提案 The proposal for adding generators and the yield statement to Python.