自定义迭代器de def __iter__(self): # 返回自身的迭代器 return self 中__iter__里面必须return 自身吗
不是必须,而是取决于你想让对象扮演什么角色。
“自己就是迭代器” —— 才 return self
此时类里还得再实现 __next__()
(或 Python2 的 next
)。
典型写法:
class CountDown: def __init__(self, n): self.n = n def __iter__(self): # 迭代器协议 ① return self # 自己就是迭代器 def __next__(self): # 迭代器协议 ② if self.n <= 0: raise StopIteration self.n -= 1 return self.n + 1
“只是可迭代对象,但迭代器另有其人” —— __iter__
返回一个新的迭代器实例
常见于“容器类”想支持多次独立遍历,例如:
class MyRange: def __init__(self, start, stop): self.start = start self.stop = stop def __iter__(self): # 返回一个全新的迭代器对象 return MyRangeIterator(self.start, self.stop) class MyRangeIterator: def __init__(self, cur, stop): self.cur = cur self.stop = stop def __iter__(self): return self def __next__(self): if self.cur >= self.stop: raise StopIteration val = self.cur self.cur += 1 return val
甚至可以让 __iter__
直接返回别的可迭代对象
例如内置列表:
class Wrapper: def __init__(self, data): self.data = data def __iter__(self): return iter(self.data) # 把迭代职责交给列表
__iter__
return self
并同时实现 __next__
。每次都是it = iter(obj),it是迭代器对象,然后next(it)__iter__
可以返回任何遵循迭代器协议的对象(包括新建的迭代器实例、生成器、甚至内置容器)。