http: //www.ibm.com/developerworks/cn/opensource/os-cn-python-yield/
``yield`` 用于定义生成器函数, 仅用于函数体内. 使用``yield``关键字, 则会创建一个生成器函数, 而不是常规函数.
调用生成器函数, 返回的是生成器迭代器, 或 生成器. 调用``next()``方法时,生成器函数的主体代码执行, 如果重复调用``next()``最终会产生一个StopIteration异常.
当``yield``语句被执行, 生成器的状态会被冻结, ``expression_list`` 的值回返回给 ``next()`` 的调用者. "冻结" 意味着所有的局部状态会返回, 包括当前定义的所有局部变量, 指令指针, 内部栈: 足够的信息被保存, 直到下次``next()``被调用, 函数可以继续被执行.
#!/usr/bin/env python
def funcA(lst):
for i in lst:
yield i + 1
print 'hoho'
a = funcA([1, 2, 3])
print a.next()
print a.next()
print a.next()
print a.next()
执行结果如下:
gnu@dev:~$ python yield.py
2
hoho
3
hoho
4
hoho
Traceback (most recent call last):
File "yield.py", line 13, in <module>
print a.next()
StopIteration
到这里,我想大家对生成器应该有了一个初步的认识.
The ``yield`` statement
***********************
yield_stmt ::= yield_expression
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.
As of Python version 2.5, the ``yield`` statement is now allowed in
the ``try`` clause of a ``try`` ... ``finally`` construct. If the
generator is not resumed before it is finalized (by reaching a zero
reference count or by being garbage collected), the generator-
iterator's ``close()`` method will be called, allowing any pending
``finally`` clauses to execute.
Note: In Python 2.2, the ``yield`` statement was only allowed when the
``generators`` feature has been enabled. This ``__future__`` import
statement was used to enable the feature:
from __future__ import generators
See also:
**PEP 0255** - Simple Generators
The proposal for adding generators and the ``yield`` statement
to Python.
**PEP 0342** - Coroutines via Enhanced Generators
The proposal that, among other generator enhancements, proposed
allowing ``yield`` to appear inside a ``try`` ... ``finally``
block.