生成器跟容器还是不一样的,生成器可能有“江郎才尽”的那一天

1.虽然我们平时从运行效果上来说,经常管“生成器”就理解成“容器”。
但是千万别忘了,生成器和列表等容器是不一样的,生成器是“惰性机制”。

要点1:我们在和生成器要值的时候,它是现做现卖的。当我们跟生成器取了最后一个值后,再跟生成器拿东西就没有了。
而列表不一样,列表这个容器就在那里放着,不管你什么时候去用它,不管你在哪用它,它都是那些值。
但是生成器不一样,跟它要了几次值后,后面可能就要不出来值了。

不妨看看下面的题目

def func():
    for i in range(4):
        yield i
g = func()  # 1.程序执行到这里,我们知道g是一个生成器,它将来能提供的值有“0,1,2,3”

g1 = (i for i in g) # 2.要点2:利用for循环遍历生成器,也是在跟生成器要值。 只不过这句代码执行时,我们没有跟g1要值,它也不会去跟g要值。
g2 = (i for i in g1)
print(list(g1))  # 3.要点3:利用list()函数对生成器进行类型转换,底层会跟生成器要值直到要不出来为止。
print(list(g2))  #题目: 结果为[],而不是【0,1,2,3】。因为上一句代码已经让生成器 

2.结论
跟生成器要值的地方,其实底层最终都是靠的生成器的__next__()方法。
posted @ 2026-01-25 19:55  GLORY-TO-THE-MANKIND  阅读(0)  评论(0)    收藏  举报