可爱的 Python: 迭代器和简单生成器
2008-11-13 13:17:36 来源:WEB开发网核心提示:欢迎来到奇妙的流控制世界,Python 2.2(现在是 alpha 发行版第三版 ― 参见本文后面的 参考资料)将给程序员提供一些新的选项,可爱的 Python: 迭代器和简单生成器,这些在较早的 Python 版本是没有的 ― 或者至少不是很方便, 虽然 Python 2.2 所给予我们的不能象 Stackless
欢迎来到奇妙的流控制世界。Python 2.2(现在是 alpha 发行版第三版 ― 参见本文后面的 参考资料)将给程序员提供一些新的选项,这些在较早的 Python 版本是没有的 ― 或者至少不是很方便。
虽然 Python 2.2 所给予我们的不能象 Stackless Python 中的完全连续性和微线程那样容易理解,但还是可以说,生成器和迭代器的行为与传统的函数和类会有点不同。
由于迭代器比较容易理解,让我们先来看它。基本上, 迭代器是含有 .next() 方法的对象。唔,这样定义不十分正确,但非常接近。事实上,当迭代器应用新的 iter() 内置函数时,大多数迭代器的上下文希望得到一个可以生成迭代器的对象。为使用户定义的类(该类含有必不可少的 .next() 方法)返回迭代器,需要使 __iter__() 方法返回 self 。本文中的示例会清楚地说明这一点。如果迭代有一个逻辑终止,则迭代器的 .next() 方法可能决定抛出 StopIteration 异常。
生成器要稍微复杂和一般化一点。但生成器最典型的用途是用来定义迭代器;所以不值得总是为一些细微之处而担心。 生成器是这样一个函数,它记住上一次返回时在函数体中的位置。对生成器函数的第二次(或第 n 次)调用跳转至该函数中间,而上次调用的所有局部变量都保持不变。
在某些方面,生成器就象本专栏前面文章讨论的函数型编程中的“终止”(参见 参考资料)。象“终止”一样,生成器“记住”了它数据状态。但生成器比“终止”要更进一步:生成器还“记住”了它在流控制构造(在命令式编程中,这种构造不只是数据值)中的位置。由于连续性使您在执行框架间任意跳转,而不总是返回到直接调用者的上下文(如同生成器那样),因此它仍是比较一般的。
更多精彩
赞助商链接