是否有必要在 python 中的自定义迭代器类上显式调用 iter()?

问题描述

我们有这个自定义迭代器类的图像:

class Counter: 
             def __init__(self,low,high):
                    self.current=low-1 
                    self.high=high
              def __iter__(self):
                    return self
              def __next__(self):
                     self.current+=1
                     if self.current  < self.high:
                                return self.current
                      raise stopiterationError

是否有必要先在对象上调用iter(),然后再在其上调用next()? (我不想使用 for 循环)

Obj=Counter(1,10)
i=iter(Obj)
print(next(i))

或者:

Obj=Counter(1,10)
print(next(Obj))

两者似乎都有效。

解决方法

从已经是迭代器的迭代器创建迭代器(调用 iter(...))是一个空操作。这解释了为什么您的两个代码段的工作方式相同。

现在,什么是迭代器? 和您一样,它是 __next__ 方法的实现。当您对其调用 __iter__ 时会使用 iter 魔术函数。通常,这两种方法是一起实现的。

因此,您的类的实例已经是一个迭代器,无需再创建。

还值得注意的是,通常迭代器仅用于 for 循环中,其中 next__next__ 被隐式调用。因此,您对迭代器的测试 - next(i) 就像迭代器上的 for 循环的一个循环。