说明
《Python 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
Python 的 StopIteration 异常由内置函数 next() 和 iterator 的 __next__()
方法所引发,用来表示该迭代器不能产生下一项。StopIteration 是 Python 中的一个内建异常类,通常用于表示迭代器已经到达末尾,不再有可供迭代的元素。在迭代器协议中,当迭代器的 __next__
方法没有更多元素可供返回时,它应该引发 StopIteration 异常。
以下的迭代器的消费情况会产生这个 StopIteration 异常:
it = iter([1, 2])
next(it) # 1
next(it) # 2
next(it) # StopIteration:
自定义迭代器中使用 StopIteration:
class MyIterator:
def __init__(self, data):
self.data = data
self.index = 0
def __iter__(self):
return self
def __next__(self):
if self.index < len(self.data):
value = self.data[self.index]
self.index += 1
return value
else:
# 迭代结束时引发 StopIteration
raise StopIteration
# 使用例子
my_iter = MyIterator([1, 2, 3, 4, 5])
try:
while True:
value = next(my_iter)
print(value)
except StopIteration:
print("Iteration completed.")
'''
1
2
3
4
5
Iteration completed.
'''
在这个例子中,MyIterator 类实现了一个简单的迭代器。当迭代到达末尾时,__next__
方法引发 StopIteration 异常。在使用 next 函数获取下一个元素时,我们使用 try-except 块捕获 StopIteration 异常,以便知道何时停止迭代。
该异常对象额外有一个属性 value,它在构造该异常时作为参数给出,默认值为 None。
当一个 generator 或 coroutine 函数返回时,将引发一个新的 StopIteration 实例,函数返回的值将被用作异常构造器的 value 形参。
如果某个生成器代码直接或间接地引发了 StopIteration,它会被转换为 RuntimeError (并将 StopIteration 保留为导致新异常的原因)。在 3.3 版更改: 添加了 value 属性及其被生成器函数用作返回值的功能。
在实际编码中,通常不需要显式处理 StopIteration 异常,因为在使用 for 循环等语法时,Python 会自动处理这个异常。例如:
def simple_generator(n):
i = 0
while i <= n:
yield i
i += 1
# 使用生成器
gen = simple_generator(3)
for value in gen:
print(value)
在这个例子中,for 循环会自动捕获 StopIteration 异常,并结束迭代,不需要我们显式进行异常处理。
总体而言,StopIteration 异常在迭代器和生成器的内部使用,通常由 Python 解释器自动处理。在手动使用迭代器时,可以使用 try-except 块捕获 StopIteration 异常以便更灵活地处理迭代结束的情况。
更新时间:2024-04-06 09:39:32 标签:python 异常 迭代