生成器惰性机制一窥(1)

先定义一个print

def log(*args,**kwargs):
    print(*args,**kwargs)
开始试验:

def fun():
    log(111)
    yield 222
    yield 333

g = fun()
g1 = (i for i in g)
g2 = (i for i in g1)

log(list(g))
log(list(g1))
log(list(g2))
输出结果为:
111
[222,333]
[]
[]
因为g本身为生成器,当g被打印后,生成器的值已经被输出,所以没有值的存在,导致g1和g2为空。
假如g未输出,即把log(list(g)) 注释(#)掉后,g1拥有[222,333],同理,g1注释后,g2拥有[222,333]。
假如在log(list(g))前,先log(g.__next__()),那么,后续只会输出[333]。因为list函数中默认有一个for循环,会把元素全拿走。而next函数只能一次调用一个。
111是用来混淆的,并没有进入生成器。
假如:
g = fun()
g1 = (i for i in g)
gx = fun()
g2 
(i for in gx)
输出是什么呢?

111
[222, 333]
[]
111
[222, 333]
因为g2生成器的源头改变了~。~
posted @ 2019-07-02 10:54  Mana66ccff  阅读(81)  评论(0)    收藏  举报