发生器是创建迭代器的简单而强大的工具。它们写起来就像是正则函数,需要返回数据的时候使用yield 语句。每次 next()被调用时,生成器回复它脱离的位置(它记忆语句最后一次执行的位置和所有的数据值)。以下示例演示了发生器可以很简单的创建出来:
>>> def reverse(data):
        for index in range(len(data)-1, -1, -1):
                yield data[index]
                
>>> for char in reverse('golf'):
        print char

f
l
o
g
前一节中描述了基于类的迭代器,它能作的每一件事发生器也能作到。因为自动创建了 __iter__()和 next()方法,发生器显得如此简洁。
另外一个关键的功能是两次调用之间的局部变量和执行情况都自动保存了下来。这样函数编写起来就比手动调用 self.index和 self.data 这样的类变量容易的多。
除了创建和保存程序状态的自动方法,当发生器终结时,还会自动抛出 StopIteration异常。综上所述,这些功能使得编写一个正则函数成为创建迭代器的最简单方法。

Footnotes
... 命名空间!9.1
有一个例外。模块对象有一个隐秘的只读对象,名为 __dict__,它返回用于实现模块命名空间的字典,命名 __dict__是一个属性而非全局命名。显然,使用它违反了命名空间实现的抽象原则,应该被严格限制于调试中。

京ICP备14028175号-6