在Python中,迭代器是一个很重要的东西。良好的迭代器定义,能让代码更加清晰。
定义一个迭代器需要实现两个方法__iter__
和__next__
。
__iter__
返回迭代器对象本身。它是必需的,以允许容器和迭代器在for .. in ..
语句中使用。
__next__
返回下一个元素。当没有元素可返回时,应抛出StopIteration
。
class X2:
def __init__(self, n: int):
self.list = [x*x for x in range(n)]
self.__count = -1
def __iter__(self):
return self
def __next__(self):
self.__count += 1
try:
return self.list[self.__count]
except IndexError:
raise StopIteration
if __name__ == "__main__":
for each in X2(10):
print(each)
但这样定义似乎有些太麻烦了,Python提供了一个更加简略的方法:
def X2(n: int):
for i in range(n):
yield i*i
if __name__ == "__main__":
for each in X2(10):
print(each)
事实上,如下代码
for each in X2(10):
print(each)
与
t = X2(10)
while True:
try:
each = t.__next__()
except StopIteration:
break
print(each)
是等价的。
能看出,for .. in ..
的运行机制,就是不断地调用被迭代对象的.__next__()
方法,直到捕获到StopIteration
异常。
明白了这一点,很容易就能知道,Python的死循环写法至少有两种:while True:
和使用for .. in ..
迭代一个拥有__iter__
和__next__
方法的对象,并且这个对象的__next__
方法永远不会抛出StopIteration
异常。
附:
next(g)
和g.__next__()
都是调用了g
的__next__()
方法,只不过next(g)
可能看起来更友好一点。