Python自定义迭代类:解决for循环初始调用next()跳过首项问题
解决迭代器跳过首个条目的问题
你的代码逻辑存在一个典型的迭代器流程错误:__iter__把数据源指针定位到条目0,但for循环启动后会立刻调用__next__,而你的__next__直接将指针移到条目1并返回,导致首个条目被跳过。
下面提供两种规范的类内解决方式:
方案1:用生成器实现__iter__(最简洁Pythonic)
直接借助Python生成器特性,无需手动实现__next__,自动处理迭代流程:
def __iter__(self): total_entries = self._tree.GetEntries() for entry_idx in range(total_entries): self._tree.GetEntry(entry_idx) yield self
每次迭代时,生成器会依次将self定位到条目0、1……直到最后一个,完全符合for循环的预期,不会遗漏任何条目。而且每次调用__iter__都会生成新的生成器实例,多次迭代互不干扰。
方案2:手动维护迭代状态
如果需要更精细的迭代控制,可以在类中添加状态变量跟踪迭代位置:
def __iter__(self): # 初始化迭代起始位置为-1,确保第一次调用__next__能定位到条目0 self._iter_idx = -1 return self def __next__(self): self._iter_idx += 1 total_entries = self._tree.GetEntries() if self._iter_idx >= total_entries: raise StopIteration # 定位到当前条目 self._tree.GetEntry(self._iter_idx) return self
这种方式通过_iter_idx变量记录迭代进度,__iter__负责重置状态,__next__每次先递增索引再定位条目,第一次调用就会返回条目0,彻底解决跳过首个条目的问题。
内容的提问来源于stack exchange,提问作者Lech Wiktor Piotrowski
相关产品推荐
相关产品推荐

