在数据结构设计中迭代是一个重要的概念。对于迭代来说,从 Python 的机制中对迭代器提供给收集对象的一个关键行为上可以得到认识。所支持的具体方法就是 dunder next 了,这个方法可以返回收集对象中下一项元素。如果没有下一项元素的话,会抛出一个 StopIteration 例外来说明不能再进行迭代了。
所以很少会去直接部署一个迭代器自定义类,相反更愿意采用生成器这种方法,因为生成器语句可以自动产生抛出迭代器的值。
Python 会自动提供迭代器部署,原因就是只要定义了 dunder len 和 dunder getitem 这两个方法后,自定义类就具备了迭代器功能。
简单示范一个低层迭代器例子:
class SequenceIterator:
“““对序列对象进行迭代的一个迭代器类型。“““
def __init__(self, sequence):
“““把一个序列对象建立成一个迭代器对象。“““
self._seq = sequence
self._k =-1 #确保第一次调用 next()函数时会从第一项元素开始
def __next__(self):
“““返回下一项元素,或者会抛出 StopIteration 例外错误。“““
self._k += 1
if self._k < len(self._seq):
return (self._seq[self._k])
else:
raise StopIteration()
def __iter__(self):
“““为了方便,迭代器必须把自身也看成一个迭代器。“““
return self