对于不少Python
的编程人员而言,使用迭代器早已经是家常便饭,而至于迭代器的概念和实施细节则不甚清楚。毕竟,Python
在语言层面提供了非常方便的使用方法(for ... in ...)。
那么,Python
在实现“遍历访问容器”这一动作的时候,又究竟发生了什么呢?
首先要说的是iter()
函数。这个函数的入参是一个实现了__iter__()
或者__getitem__()
方法的容器或者迭代器,返回一个迭代器对象。对于容器而言,它返回一个迭代器对象,对于迭代器而言,他返回迭代器本身。
简单来说,迭代器协议就是:
- 实现了
__iter__()
方法,并返回一个迭代器。 - 实现了
next()
方法,返回当前元素,并指向下一个元素,若当前位置无元素,则抛出一个StopIteration
的异常。
这种松散的统一约定好处在于对外提供一个一致的访问容器(或集合)的统一接口。只要定义了__iter__()
方法,就可以便捷的使用迭代器协议(常见的for...in...语法使用)。除此之外,迭代器协议还采用了惰性求值。这种策略可以优化系统的内存使用情况,方便对于一个大体积的文件采用迭代器协议。下一次,我打算简单来说一下生成器的事。
网友评论