创建一个迭代器后,根据迭代的要求已经迭代完了,但是它还是在一直运行,比如下面的代码。
class My:
def __iter__(self):
self.a = 1
return self
def __next__(self):
if self.a <=5:
x = self.a
self.a += 1
return x
Myclass = My()
myiter = iter(Myclass)
for x in myiter:
print(x)
细看代码没有什么问题,运行一下,结果如下。
1
2
3
4
5
None
……
一直运行个不停。
解决方案:
StopIteration 完美解决。
StopIteration 异常用于标识迭代的完成,防止出现无限循环的情况,在 __next__() 方法中我们可以设置在完成指定循环次数后触发 StopIteration 异常来结束迭代。
将上面的代码添加一个异常指令:
else:
raise StopIteration
class My:
def __iter__(self):
self.a = 1
return self
def __next__(self):
if self.a <=5:
x = self.a
self.a += 1
return x
else:
raise StopIteration
Myclass = My()
myiter = iter(Myclass)
for x in myiter:
print(x)