Menu
CoddyTech

StopIteration 异常

Coddy Python 迭代器 课程的第 3 课,共 13 课。

StopIteration 异常是 Python 迭代器协议的重要组成部分。它表示迭代序列已结束,并在控制迭代器行为方面发挥着重要作用。让我们来了解这个异常及其重要性。

什么是 StopIteration?

StopIteration 是 Python 内置的异常。当迭代器耗尽,也就是没有更多项可以返回时,就会引发此异常。

什么时候会引发 StopIteration?

在以下两种主要情况下,Python 会自动引发 StopIteration 异常:

  1. 对没有更多项的迭代器调用 next() 函数时。
  2. 自定义迭代器的 __next__() 方法被实现为在迭代结束时引发 StopIteration 时。

StopIteration 示例

来看看 StopIteration 如何与简单的迭代器一起工作:

my_list = [1, 2, 3]
my_iterator = iter(my_list)

print(next(my_iterator))  # 输出:1
print(next(my_iterator))  # 输出:2
print(next(my_iterator))  # 输出:3
print(next(my_iterator))  # 抛出 StopIteration 异常

在这个示例中,遍历完 my_list 中的所有元素后,再次调用 next() 会引发 StopIteration 异常。

对迭代器行为的重要性

StopIteration 异常之所以重要,有以下几个原因:

  1. 表示结束:它会清楚地表明迭代已经结束。
  2. 结束 for 循环:Python 的 for 循环依靠 StopIteration 来判断何时结束。
  3. 控制自定义迭代器:创建自定义迭代器时,引发 StopIteration 可以让你定义迭代何时结束。

处理 StopIteration

for 循环会自动处理 StopIteration,但直接使用 next() 时,你可能需要显式处理此异常:

my_iterator = iter([1, 2, 3])

try:
    while True:
        item = next(my_iterator)
        print(item)
except StopIteration:
    print("Iteration finished")

这段代码会打印数字 1、2 和 3,并在捕获到 StopIteration 异常后打印 "Iteration finished"。

理解 StopIteration 异常对于在 Python 中使用迭代器至关重要,因为它提供了一种标准化的机制来控制迭代并使其结束。

quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

challenge icon

挑战

简单

创建一个自定义迭代器,生成不超过给定上限的质数序列。当迭代器达到或超过上限时,应使用 StopIteration 异常来表示序列结束。

已提供以下内容:

  • 一个作为输入的整数 limit

你的迭代器应当:

  • 从 2 开始生成质数
  • 当下一个质数会超过给定上限时,抛出 StopIteration 异常

将迭代器实现为一个类,并包含 __iter__() 和 __next__() 方法。使用 __next__() 方法生成下一个质数,并处理 StopIteration 异常。

每行输出一个生成的质数。

输入将以表示整数的字符串形式提供。

亲手试试

# 读取输入
limit = int(input())

class PrimeIterator:
    def __init__(self, limit):
        self.limit = limit
        self.current = 2

    def __iter__(self):
        return self

    def __next__(self):
        # TODO:实现生成下一个质数的逻辑
        # 如果下一个质数超过 limit,就抛出 StopIteration
        # 如果下一个质数不超过 limit,就返回它
        pass

# 创建一个 PrimeIterator 实例
prime_iter = PrimeIterator(limit)

# 遍历质数并逐个打印
try:
    for prime in prime_iter:
        print(prime)
except StopIteration:
    pass  # 迭代结束

Python 迭代器中的所有课

自己练习: Python 在线编译器