如何实现支持嵌套迭代的自定义Python迭代器?
解决方法
核心问题在于你原来的类把可迭代对象和迭代器混在了一起:__iter__返回了self,每次迭代都共享同一个实例的状态。而列表这类内置可迭代对象,每次调用iter()都会返回一个全新的迭代器,各自维护自己的进度。
最简单的修改方式有两种:
方法1:用内部类封装独立迭代器
把迭代器的状态封装到内部类里,每次调用__iter__都创建这个内部类的新实例,确保每次迭代都有独立的进度:
class MyNumbers: def __iter__(self): class Iterator: def __init__(self): self.a = 1 def __next__(self): if self.a <= 3: x = self.a self.a += 1 return x else: raise StopIteration return Iterator()
方法2:用生成器实现__iter__
生成器是Python里实现迭代器的简便方式,每次调用__iter__都会生成一个全新的生成器实例,天然支持独立迭代:
class MyNumbers: def __iter__(self): a = 1 while a <= 3: yield a a += 1
测试这两种修改后的类,再运行之前的嵌套迭代代码,就能得到和列表一致的正常输出。原理很简单:每次外层或内层调用iter(myclass)(包括for...in循环的隐式调用),都会得到一个全新的迭代器,各自维护自己的进度变量,互不干扰。
内容的提问来源于stack exchange,提问作者hoelzeli
相关产品推荐
相关产品推荐

