为什么举起来了“的StopIteration”,而是“为”做一个正常的回报?(Why does ne

2019-07-18 10:16发布

在这段代码,为什么用“的”结果中没有“的StopIteration”或者是“for”循环捕获所有异常,然后默默离开? 在这种情况下,为什么我们有多余的“回报”? 或者是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??

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

Answer 1:

for循环监听StopIteration明确。

的目的for语句是遍历由迭代器提供的序列和异常用于信号迭代器现在完成的; for不赶由对象引发上迭代的其他异常,只是一个。

这是因为StopIteration是正常的,预期的信号告诉任何人被迭代,没有什么更多的待产。

发电机的功能是一种特殊的迭代器; 它的确引发StopIteration时,该功能完成(即当它返回,所以是的, return None引发StopIteration )。 这是迭代器的要求; 他们必须提高StopIteration当他们完成; 事实上,一旦StopIteration已经提出,试图从他们那里得到另一个元素(通过next()或调用.next() (PY 2)或.__next__()的迭代器(PY 3)方法) 必须始终提高StopIteration一次。

GeneratorExit是在其他方向上进行通信的异常。 你被明确关闭发电机与yield的表达的方式,以及Python的传达封闭的发电机是通过提高GeneratorExit该函数的内部。 你明确地捕获了异常的内部countdown ,其目的是让需要关闭时,发电机清理资源。

GeneratorExit不会传播给该呼叫者; 看到generator.close()文档 。



文章来源: Why does next raise a 'StopIteration', but 'for' do a normal return?