首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >python生成器函数中使用try-finally的执行顺序

python生成器函数中使用try-finally的执行顺序
EN

Stack Overflow用户
提问于 2022-07-19 08:44:58
回答 3查看 55关注 0票数 0
代码语言:javascript
运行
复制
def gen():
    try:
        yield 1
    finally:
        print("finally")


def main():
    print(next(gen()))

这段代码打印

代码语言:javascript
运行
复制
finally
1

我不明白这里的处决顺序。为什么“最后”要印在"1“之前?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-07-19 09:14:34

您可以将行print(next(gen()))重写为

代码语言:javascript
运行
复制
g = gen()  # temporary variable
val = next(g)
#          # the generator is now deleted because the variable g is not referenced anymore
del(g)     # that calls the "finally" block `print("finally")`
print(val)

如果将生成器赋值给一个变量,但不要删除它,那么它将在main函数的末尾被回收。这可能就是你所期望的。

如果您通过next()使用生成器,则应该将它分配给一个变量,否则将无法使用带有更多项目的生成器,因为它将在第一个项目之后被回收!

票数 0
EN

Stack Overflow用户

发布于 2022-07-19 08:48:46

之所以将"finally“打印在"1”之前,是因为Python所做的第一件事是解析next(gen()),这涉及返回1和打印“最终”。一旦完成了next(gen())的执行,它最终打印出来,值为1。现在,它可以解析print(1),它打印"1“。

票数 0
EN

Stack Overflow用户

发布于 2022-07-19 08:50:46

下面是一个正在发生的例子

  1. next( gen() )被执行-> gen()打印“最终”-> next()获取值
  2. next()返回值
  3. print()打印值

你得先看看里面的东西,然后再看看外壳和外壳等等。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73033854

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档