鱼C论坛

 找回密码
 立即注册
查看: 1117|回复: 7

[已解决]看不懂一个生成器的问题

[复制链接]
发表于 2020-5-24 20:52:49 | 显示全部楼层 |阅读模式
50鱼币
本帖最后由 毛毛不爱读书 于 2020-5-24 21:10 编辑

正在学习生成器, 无法理解以下代码的运行结果:
def test():
    for i in range(4):
        yield i


g = test()
for n in [2, 10]:
    g = (n+i for i in g)


print(list(g))
其运行结果:
[20, 21, 22, 23]
---------------
改动一下代码, 结果又不一样:
def test():
    for i in range(4):
        yield i


g = test()

g = (2 + i for i in g)
g = (10 + i for i in g)

print(list(g))
其运行结果为:
[12, 13, 14, 15]
-------------
主要无法理解第一个代码, 后面那个的还能想明白.
最佳答案
2020-5-24 20:52:50
本帖最后由 jinlovelive 于 2020-5-24 22:22 编辑

试了下,应该是生成器赋值的问题,在你的例子中会赋值两次,形成g = (n+i for i in (n+i for i in g)),n的取值最后会循环最后的值(这里是10)。然后list调用生成函数后,会把n=10带入赋值公式,最后就会得到[20,21,22,23]这个数据
看大佬解释

最佳答案

查看完整内容

试了下,应该是生成器赋值的问题,在你的例子中会赋值两次,形成g = (n+i for i in (n+i for i in g)),n的取值最后会循环最后的值(这里是10)。然后list调用生成函数后,会把n=10带入赋值公式,最后就会得到[20,21,22,23]这个数据 看大佬解释
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-5-24 20:52:50 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jinlovelive 于 2020-5-24 22:22 编辑

试了下,应该是生成器赋值的问题,在你的例子中会赋值两次,形成g = (n+i for i in (n+i for i in g)),n的取值最后会循环最后的值(这里是10)。然后list调用生成函数后,会把n=10带入赋值公式,最后就会得到[20,21,22,23]这个数据
看大佬解释
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-5-24 20:56:25 | 显示全部楼层
变循环边计算
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-5-24 21:03:33 | 显示全部楼层

能说明白一点吗? 资质鲁钝, 点一下仍是不懂.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-5-24 21:22:25 | 显示全部楼层
g = test()完之后立刻print一下你就知道了含义了,另外生成器看小甲鱼的扩展阅读:https://fishc.com.cn/thread-56023-1-2.html
g = test()
print(list(g))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-5-24 21:45:12 | 显示全部楼层
suchocolate 发表于 2020-5-24 21:22
g = test()完之后立刻print一下你就知道了含义了,另外生成器看小甲鱼的扩展阅读:https://fishc.com.cn/th ...

懵逼, 立刻print我本来就知道结果是
[0, 1, 2, 3]
啊, 不知道我从这能新明白什么.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-5-24 23:02:05 | 显示全部楼层
jinlovelive 发表于 2020-5-24 22:00
试了下,应该是生成器赋值的问题,在你的例子中会赋值两次,形成g = (n+i for i in (n+i for i in g)),n的 ...

或许真的是这样的, 看来我对于for...in...循环过程并没有理解清楚, 如果真是这样的话,
for n in [2, 10]:
    g = (n+i for i in g)
的循环过程应该是这样的:
n = 2
g = (n+i for i in g)
n = 10
g = (n+i for i in g)
这样就好理解了. 生成器推导式根本就没有代入n的值. n在推导式中相当于一个参数.
当list(g)真正使用生成器时, 此时再代入n的值, 也就是10.

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-5-25 09:24:20 | 显示全部楼层
毛毛不爱读书 发表于 2020-5-24 21:45
懵逼, 立刻print我本来就知道结果是啊, 不知道我从这能新明白什么.

那当我没说,你还是看书吧。小甲鱼讲的很清楚了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-21 02:00

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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