当前位置: 首页 > 面试题库 >

为什么下一个为什么会引发“ StopIteration”,而“ for”却会正常返回?

乐正涵忍
2023-03-14
问题内容

在这段代码中,为什么使用for结果为noStopIteration
for循环捕获所有异常然后静默退出?在这种情况下,为什么会有多余的return?还是由以下 raise StopIteration原因引起的return None

#!/usr/bin/python3.1
def countdown(n):
    print("counting down")
    while n >= 9:
        yield n
        n -= 1
    return

for x in countdown(10):
    print(x)

c = countdown(10)
next(c)
next(c)
next(c)

假设StopIteration由触发return None。什么时候GeneratorExit产生的?

def countdown(n):
    print("Counting down from %d" % n)
    try:
        while n > 0:
            yield n
            n = n - 1
    except GeneratorExit:
        print("Only made it to %d" % n)

如果我手动执行以下操作:

c = countdown(10)
c.close() #generates GeneratorExit??

在这种情况下,为什么看不到追溯?


问题答案:

for循环监听StopIteration明确。

for语句的目的是循环遍历迭代器提供的序列,并使用异常表示当前迭代器已完成。for不会捕获被迭代的对象引发的其他异常,只是那个异常。

这是因为StopIteration正常的预期信号是告诉任何正在迭代的人不再生产更多东西。

生成器函数是一种特殊的迭代器。StopIteration当函数完成时,它确实会上升(即,当它返回时,所以return None会上升StopIteration)。这是迭代器的要求;他们
必须StopIteration在完成时加薪;实际上,一旦StopIteration引发了a,尝试从它们中获取另一个元素(通过next()或在迭代器上调用.next()(py
2)或.__next__()(py 3)方法必须 总是StopIteration再次引发。

GeneratorExit另一个 方向上交流是一个例外。您正在使用表达式显式 关闭
生成器,yieldPython将闭包传递给生成器的方式是通过引发GeneratorExit该函数的内部。您可以在中明确捕获该异常countdown,其目的是让生成器在关闭时根据需要清除资源。

AGeneratorExit不传播给呼叫者;请参阅generator.close()文档。



 类似资料:
  • 问题内容: 在Java中: 抛出。为什么?为什么在这里投降?我不知道原因。 问题答案: 让我重命名您的班级,以使事情更加清楚。 -> 。 -> 。 仅仅因为你是一个人并不意味着你是一个人。你可能是一个。这就是将A强制转换为A的原因。 另一方面,每个是吗?答案是“是”。这就是为什么您 可以 编写如下代码: 要么 另外值得注意的是,您 可以 执行以下操作: 这样做的原因是您的变量实际上是在引用实例。因

  • 这似乎与对象没有被实例化有关,尽管我不太明白为什么。有人知道出什么事了吗?

  • 为什么这段代码不抛出?看一看: 我不知道!

  • 问题内容: 为什么这段代码没有抛出?看一看: 我不知道! 问题答案: 您为什么不能自己检查一下并抛出异常(如果您要的话)。

  • 问题内容: 我想知道为什么在引用“ w”之后会引发错误。您不是通过说obj = w来创建另一个指向该w实例的指针吗?也就是说,为什么与说谢谢一样呢? 问题答案: 没有什么比早上引用JLS更重要。 JLS 6.3。宣言的范围: 块中的局部变量声明的范围(第14.4节)是该声明在其中出现的其余部分,从其自身的初始化程序开始,并在局部变量声明语句的右侧包括其他任何声明符。 和 JLS 14.2 方块:

  • 问题内容: 我正在尝试使用pip安装软件包。我尝试 运行,但是得到了。为什么会出现此错误?如何使用pip安装软件包? 问题答案: 是从命令行而不是Python解释器运行的。这是一个安装模块的程序,因此你可以从Python使用它们。安装模块后,即可打开Python shell并执行。 不是命令行,而是一个交互式解释器。你在其中键入代码,而不是命令。