首页 > 解决方案 > yield 语句在 python 中是如何工作的?

问题描述

G'day 伙计们,所以我开始学习一些 python 并试图理解为什么会发生以下情况:

def g():
    for i in [1,2]:
        yield i
    print('a')

x=g()
next(x) #output=1
next(x) #output=2
next(x) #output='a', StopIteration exception thrown

在最后的 next(x) 调用中,为什么在 StopIteration 异常之前打印“a”?我希望因为 for 循环已经结束,它会抛出一个 StopIteration 异常,并且 'a' 将没有机会被打印出来。只是生成器函数的设计是这样的,在产生 StopIteration 异常的迭代中,代码继续到函数的末尾,此时 StopIteration 异常在最后抛出?我只是想检查一下确实是这样,而且我没有遗漏任何东西!

编辑:我认为将这个问题标记为重复有点不公平。是的,有很多关于产量的详细答案,我自己正在阅读一本 1500 页的关于 python 的书,但是当你的脑海中有一个错误的概念时,如果没有人指出你的概念在哪里出错,你可能很难理解解释. 现在我有了正确的答案,我可以看到问题在于我认为当 for 循环耗尽时会引发 StopIteration 异常。我现在意识到,当没有遇到进一步的产量表达式时,它会被抛出。感谢所有回复,他们帮助我解决了我的想法。

标签: pythongenerator

解决方案


推荐阅读