yield_stmt |
::= | "yield" expression_list |
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.
yield语句仅当定义生成器函数的时候使用,也只能用于生成器函数体中。在一个函数定义中使用yield语句足以导致该定义产生一个生成器函数而不是普通函数。
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.
当生成器函数被调用的时候,它返回一个迭代器,称为生成器迭代器,或者更常用的,生成器。通过重复地调用生成器的next()方法来运行生成器的函数体,直到抛出一个异常。
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.
当一个yield语句被执行的时刻,该生成器的状态就被冻结起来,而表达式表的值则被返回给next()方法的调用者。所谓“冻结”我们指的是所有局部状态都被保持,包括局部变量的当前约束,(指向下条的)指令指针,内部的求值堆栈:保留了充分多的信息,使得当下次激活next()的时候,函数执行起来完全好像yield语句不过是另外一个外部调用。
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块会被执行。
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: