鱼C论坛

 找回密码
 立即注册
查看: 2344|回复: 5

[已解决]关于yield和return

[复制链接]
发表于 2023-7-29 12:23:26 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
def gen():
    print('Loop1')
    yield 100
    print('Loop2')
    return 200


for i in gen():
    print(i)

运行结果是:
Loop1
100
Loop2

求问高手们:
(不必讲yield和return的区别)

return的200去哪了
在这段代码上加什么语句,才能把这个200显示出来。
最佳答案
2023-7-29 12:23:36
在这段代码中, return 语句虽然存在于生成器函数 gen() 中,但是由于生成器函数的特性,当使用 for i in gen() 迭代生成器时,生成器函数的执行流程在执行到 return 语句时会直接终止,导致 return 后面的值(即200)无法被获取到或显示出来。在生成器函数中, return 可以被认为是一种终止符,用于结束生成器的迭代。

要显示出 return 后面的值(即200),可以通过捕获生成器的 StopIteration 异常来实现。在 for 循环中使用 try 和 except 块来捕获异常,并在异常块中获取 return 的值。下面是修改后的代码:

  1. def gen():
  2.     print('Loop1')
  3.     yield 100
  4.     print('Loop2')
  5.     return 200

  6. gen_obj = gen()
  7. for i in gen_obj:
  8.     print(i)
  9. try:
  10.     print(next(gen_obj))
  11. except StopIteration as e:
  12.     print('return的值是:', e.value)
复制代码


输出结果为:

  1. Loop1
  2. 100
  3. Loop2
  4. return的值是: 200
复制代码


在修改后的代码中,我们先创建了生成器对象 gen_obj ,然后使用 for 循环迭代生成器获取前面的值(即100),最后通过捕获 StopIteration 异常获取 return 后面的值(即200),从而成功显示出了 return 的值。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-7-29 12:23:36 | 显示全部楼层
在这段代码中,return语句的作用是结束生成器函数并返回一个值。然而,在for循环中使用生成器函数时,它不会直接返回这个值,而是通过yield语句逐个产生值。

要显示返回值200,可以使用StopIteration异常来捕获生成器迭代的结束,然后从异常对象中获取返回值。以下是修改后的代码示例:

  1. def gen():
  2.     print('Loop1')
  3.     yield 100
  4.     print('Loop2')
  5.     return 200

  6. g = gen()
  7. for i in g:
  8.     print(i)

  9. try:
  10.     result = next(g)
  11. except StopIteration as e:
  12.     result = e.value

  13. print(result)
复制代码


输出结果将为:

  1. Loop1
  2. 100
  3. Loop2
  4. 200
复制代码


通过使用try-except块捕获StopIteration异常,并从异常对象e中获取返回值,我们可以将200显示出来。
如果问题已经解决,请设置最佳答案

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
awp + 1 + 1 谢谢大佬!

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-29 12:23:36 | 显示全部楼层    本楼为最佳答案   
在这段代码中, return 语句虽然存在于生成器函数 gen() 中,但是由于生成器函数的特性,当使用 for i in gen() 迭代生成器时,生成器函数的执行流程在执行到 return 语句时会直接终止,导致 return 后面的值(即200)无法被获取到或显示出来。在生成器函数中, return 可以被认为是一种终止符,用于结束生成器的迭代。

要显示出 return 后面的值(即200),可以通过捕获生成器的 StopIteration 异常来实现。在 for 循环中使用 try 和 except 块来捕获异常,并在异常块中获取 return 的值。下面是修改后的代码:

  1. def gen():
  2.     print('Loop1')
  3.     yield 100
  4.     print('Loop2')
  5.     return 200

  6. gen_obj = gen()
  7. for i in gen_obj:
  8.     print(i)
  9. try:
  10.     print(next(gen_obj))
  11. except StopIteration as e:
  12.     print('return的值是:', e.value)
复制代码


输出结果为:

  1. Loop1
  2. 100
  3. Loop2
  4. return的值是: 200
复制代码


在修改后的代码中,我们先创建了生成器对象 gen_obj ,然后使用 for 循环迭代生成器获取前面的值(即100),最后通过捕获 StopIteration 异常获取 return 后面的值(即200),从而成功显示出了 return 的值。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-29 12:25:27 | 显示全部楼层
isdkz 发表于 2023-7-29 12:23
在这段代码中, return 语句虽然存在于生成器函数 gen() 中,但是由于生成器函数的特性,当使用 for i in g ...

大佬,你这解答疑问的速度快到有点不像人类啊。Orz太猛了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-29 12:30:01 | 显示全部楼层
awp 发表于 2023-7-29 12:25
大佬,你这解答疑问的速度快到有点不像人类啊。Orz太猛了

写了个chatgpt脚本
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-29 12:32:22 | 显示全部楼层
isdkz 发表于 2023-7-29 12:30
写了个chatgpt脚本

Orz
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-23 07:00

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表