Python -- yield

本文深入探讨了Python中生成器的概念及应用。通过解释`yield`关键字的作用,文章展示了如何定义生成器函数,并演示了生成器迭代器的工作原理。此外,还介绍了在不同版本的Python中使用生成器的注意事项。

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.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值