python - 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 异常。我现在意识到,当没有遇到进一步的产量表达式时,它会被抛出。感谢所有回复,他们帮助我解决了我的想法。
解决方案
推荐阅读
- python - 多边形到二进制掩码
- pentaho - Pentaho 将空字符串视为 null
- javascript - 后端接收H5前端图片上传成功,但是服务器图片显示失败?
- dimensional-modeling - 维度建模:多个事实表中的相同退化维度或使用一致维度
- flutter - 如何在 PageView builder 中使用相同的索引两次?
- asp.net-core - 我们可以在一个应用程序中为多个用户设置任意数量的重定向 URI 吗?
- assembly - 如何进行位旋转?
- subscription - Svelte 商店的自动订阅是否适用于非组件文件?
- javascript - 我的 Swiper.js 不会在悬停时停止(仅在添加速度参数后)
- android - Stripe presentWithSetupIntent 不显示 SetupIntents 的 PaymentSheet