- 集合的迭代器(iterator)提供了一个关键的行为:它支持一个名为
__next__的特殊方法,如果集合有下一个元素,该方法返回该元素,否则产生一个 StopIteration 异常来表明没有下一个元素。 - 幸运的是,很少需要直接实现迭代器类。我们的首选方法是使用生成器(generator)语法,它自动产生一个已生成值的迭代器。
- python 也为实现
__len__和__getitem__的类提供了一个自动的迭代器。为了提供一个低级迭代器的例子,代码演示了这种迭代器类可用于支持__len__和__getitem__的集合的处理。该类可被实例化为 SequenceIterator(data)。它通过保存在内部的数据序列引用来操作该序列以及当前的索引。每次调用__next__时,索引递增,直到序列结束。
例1
class SequenceIterator:
"""An iterator for any of Python's sequence types."""
def __init__(self, sequence):
"""Create an iterator for the given sequence."""
self._seq = sequence # keep a reference to the underlying data
self._k = -1 # will increment to 0 on first call to next
def __next__(self):
"""Return the next element, or else raise StopIteration error."""
self._k += 1 # advance to next index
if self._k < len(self._seq):
return self._seq[self._k] # return the data element
else:
raise StopIteration() # there are no more element
def __iter__(self):
"""By convention, an iterator must return itself as an iterator"""
return self
for i in SequenceIterator('123456'):
print(i)
输出
1
2
3
4
5
6
例2
class Seq:
def __init__(self, seq):
self._seq = seq
self._length = len(seq)
def __len__(self):
self._length
def __getitem__(self, k):
if k < self._length:
return list(self._seq.values())[k]
else:
raise StopIteration() # 需要在没有的时候抛出 StopIteration 否则无法结束
dic = {1: 'a', 2: 'b', 4: 'c', 5: 'd'}
for i in Seq(dic):
print(i)
输出
a
b
c
d
只要类支持 __len__ 和 __getitem__ ,该类就自动支持迭代,既可以用 for 循环进行遍历
本文介绍了Python中迭代器的基本概念及其实现方式。首先探讨了迭代器的关键行为——__next__方法,接着介绍了如何使用生成器简化迭代器的实现,并通过示例展示了如何手动创建迭代器类来支持__len__和__getitem__的方法。
805

被折叠的 条评论
为什么被折叠?



