可爱的 Python: 迭代器和简单生成器
2008-11-13 13:17:36 来源:WEB开发网核心提示: 这个定制迭代器看起来确实如同由函数生成的真实列表一样:随机遍历类的迭代for num in randomwalk_iter():print num,事实上,即使支持习惯用法 if elem in iterator ,可爱的 Python: 迭代器和简单生成器(5),它仅尝试为确定真值所需要
这个定制迭代器看起来确实如同由函数生成的真实列表一样:
随机遍历类的迭代
for num in randomwalk_iter():
print num,
事实上,即使支持习惯用法 if elem in iterator ,它仅尝试为确定真值所需要的那么多的迭代器的元素,(如果最终的值为 false,当然,它就需要测试所有元素)。
美中不足
上述方法对于手边的问题非常好用。但没有一种方法能很好地解决这样的情形:例程在运行中创建了大量的局部变量,并把它的运行简化为循环和条件的嵌套。如果带静态(或全局)变量的迭代器类或函数取决于多个数据状态,则出现两个问题。一个是一般性问题:创建多个实例属性或静态列表元素来保留每个数据值。更为重要的问题是计算如何确切地返回到与数据状态相符的流逻辑的相关部分。非常容易忘记不同数据间的相互作用和互相依存。
生成器完全绕过了整个问题。生成器“返回”时带关键字 yield ,但“记住”了它“返回”的所有确切执行位置。下次调用生成器时,它再接着上次的位置 — 包括函数流和变量值这两个方面。
在 Python 2.2+ 中,不直接 写生成器。相反,编写一个函数,当调用它时,返回生成器。这可能看起来有点古怪,但“函数工厂”是 Python 的常见特性,并且“生成器工厂”明显是这个概念性扩展。在 Python 2.2+ 中使函数成为生成器工厂是它主体某处的一个或多个 yield 语句。如果 yield 发生, return 一定只发生在没有伴随任何返回值的情况中。然而,一个较好的选择是,安排函数体以便于完成所有 yield 之后,执行就“跳转到结束”。但如果遇到 return ,它导致产生的生成器抛出 StopIteration 异常,而不是进一步生成值。
更多精彩
赞助商链接