看不懂一个生成器的问题
本帖最后由 毛毛不爱读书 于 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 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
变循环边计算
能说明白一点吗? 资质鲁钝, 点一下仍是不懂. g = test()完之后立刻print一下你就知道了含义了,另外生成器看小甲鱼的扩展阅读:https://fishc.com.cn/thread-56023-1-2.html
g = test()
print(list(g)) suchocolate 发表于 2020-5-24 21:22
g = test()完之后立刻print一下你就知道了含义了,另外生成器看小甲鱼的扩展阅读:https://fishc.com.cn/th ...
懵逼, 立刻print我本来就知道结果是啊, 不知道我从这能新明白什么. 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.
毛毛不爱读书 发表于 2020-5-24 21:45
懵逼, 立刻print我本来就知道结果是啊, 不知道我从这能新明白什么.
那当我没说,你还是看书吧。小甲鱼讲的很清楚了。
页:
[1]