毛毛不爱读书 发表于 2020-5-24 20:52:49

看不懂一个生成器的问题

本帖最后由 毛毛不爱读书 于 2020-5-24 21:10 编辑

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


g = test()
for n in :
    g = (n+i for i in g)


print(list(g))
其运行结果:
---------------
改动一下代码, 结果又不一样:
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))
其运行结果为:
-------------
主要无法理解第一个代码, 后面那个的还能想明白.

jinlovelive 发表于 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带入赋值公式,最后就会得到这个数据
看大佬解释{:10_277:}

青出于蓝 发表于 2020-5-24 20:56:25

变循环边计算

毛毛不爱读书 发表于 2020-5-24 21:03:33

青出于蓝 发表于 2020-5-24 20:56
变循环边计算

能说明白一点吗? 资质鲁钝, 点一下仍是不懂.

suchocolate 发表于 2020-5-24 21:22:25

g = test()完之后立刻print一下你就知道了含义了,另外生成器看小甲鱼的扩展阅读:https://fishc.com.cn/thread-56023-1-2.html
g = test()
print(list(g))

毛毛不爱读书 发表于 2020-5-24 21:45:12

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

懵逼, 立刻print我本来就知道结果是啊, 不知道我从这能新明白什么.

毛毛不爱读书 发表于 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 :
    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.

suchocolate 发表于 2020-5-25 09:24:20

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

那当我没说,你还是看书吧。小甲鱼讲的很清楚了。
页: [1]
查看完整版本: 看不懂一个生成器的问题