在线文档教程

Types: 5. Iterator Types

5. Iterator Types

2.2版本中的新功能。

Python支持对容器进行迭代的概念。这是使用两种不同的方法实现的; 这些用于允许用户定义的类支持迭代。下面更详细地描述的序列总是支持迭代方法。

需要为容器对象定义一个方法来提供迭代支持:

container.__iter__()

返回一个迭代器对象。该对象需要支持下面描述的迭代器协议。如果一个容器支持不同类型的迭代,可以提供额外的方法来专门为这些迭代类型请求迭代器。(支持多种形式迭代的对象的一个​​例子是支持广度优先和深度优先遍历的树结构。)此方法对应tp_iter于Python / C API中Python对象的类型结构的槽。

迭代器对象本身需要支持以下两种方法,它们一起构成迭代器协议

iterator.__iter__()

返回迭代器对象本身。这是允许容器和迭代器与forin语句一起使用所必需的。此方法对应tp_iter于Python / C API中Python对象的类型结构的插槽。

iterator.next()

从容器中返回下一个项目。如果没有其他项目,请举例说明StopIteration。此方法对应tp_iternext于Python / C API中Python对象的类型结构的插槽。

Python定义了几个迭代器对象来支持对通用和特定序列类型,字典以及其他更专用的形式的迭代。除了迭代器协议的实现之外,特定的类型并不重要。

该协议的意图是,一旦迭代器的next()方法提出StopIteration,它将继续在随后的调用中这样做。不遵守这一财产的实施被视为破产。(这个约束是在Python 2.3中添加的;在Python 2.2中,根据这个规则破坏了各种迭代器。)

5.1 生成器类型

Python的生成器提供了一种实现迭代器协议的便捷方式。如果容器对象的__iter__()方法作为生成器实现,它将自动返回提供__iter__()next()方法的迭代器对象(技术上讲,生成器对象)。有关生成器的更多信息可以在yield表达式的文档中找到。