Types: 5. Iterator Types
5. Iterator Types
2.2版本中的新功能。
Python支持对容器进行迭代的概念。这是使用两种不同的方法实现的; 这些用于允许用户定义的类支持迭代。下面更详细地描述的序列总是支持迭代方法。
需要为容器对象定义一个方法来提供迭代支持:
container.__iter__()
返回一个迭代器对象。该对象需要支持下面描述的迭代器协议。如果一个容器支持不同类型的迭代,可以提供额外的方法来专门为这些迭代类型请求迭代器。(支持多种形式迭代的对象的一个例子是支持广度优先和深度优先遍历的树结构。)此方法对应tp_iter
于Python / C API中Python对象的类型结构的槽。
迭代器对象本身需要支持以下两种方法,它们一起构成迭代器协议
:
iterator.__iter__()
返回迭代器对象本身。这是允许容器和迭代器与for
和in
语句一起使用所必需的。此方法对应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表达式的文档中找到。