第一个
def demo():
for i in range(4):
yield i
g=demo()
g1=(i for i in g)
g2=(i for i in g1)
print(list(g1)) # 此时才执行上面的一系列 代码,此时 去找g1,然后 g1 才去找 g ,而且这个时候只要一个值,去调用 demo ,然后拿到一个值,然后给 g1,然后再去拿第二个,第三个....
print(list(g2)) # 此时 g2 去找g1 ,此时g1 是一个生成器表达式,而且已经都取出来了,所以 已经没有值了
在 执行 print(list(g1)) 之前 上面的一系列代码并没有执行,因为我用的是生成器表达式,和生成器函数一样, 只要你不找他取他就不会生成,
直到 print(list(g1)) ,才开始执行,此时才执行上面的一系列 代码,此时 去找g1,然后 g1 才去找 g ,而且这个时候只要一个值,去调用 demo ,然后拿到一个值,然后给 g1,然后再去拿第二个,第三个....
执行到 print(list(g2))的时候 , 此时 g2 去找g1 ,此时g1 是一个生成器表达式,而且已经都取出来了,所以 已经没有值了
执行的顺序是这样的
看效果,走一个
In [4]: def demo():
...: for i in range(4):
...: yield i
...:
...: g=demo()
...:
...: g1=(i for i in g)
...: g2=(i for i in g1)
...:
In [5]: print(list(g1))
[0, 1, 2, 3]
In [6]: print(list(g2)) # 取没了,所以为空,如果没有上面的print(list(g1)) ,那么得到的值就是 [0, 1, 2, 3]
[]
第二个
def add(n,i):
return n+i
def test():
for i in range(4):
yield i
g=test()
n = 1
g=(add(n,i) for i in test()) # 这个时候我并没有去取值,因为我用的是生成器表达式,和生成器函数一样, 只要你不找他取他就不会生成
n = 10
g=(add(n,i) for i in g) # --> g=(add(n,i) for i in (add(n,i) for i in test())) # 此处的i 就是 0 1 2 3 ,add(n,i) 就是n 和 0 1 2 3,n是10 ,所以就是 ---> g=(add(n,i) for i in (10,11,12,13))) -- -> g=(20,21,22,23)
# 到此为止,生成器里面根本就没有执行,也就是 我从来没有在里面拿过值,代码从头到尾都没有执行
print(list(g)) #直到此处 才执行 ,才开始去找g 去执行上面的一系列内容
`g=(add(n,i) for i in g) # --> g=(add(n,i) for i in (add(n,i) for i in test())) # 此处的i 就是 0 1 2 3 ,add(n,i) 就是n 和 0 1 2 3,n是10 ,所以就是 ---> g=(add(n,i) for i in (10,11,12,13))) -- -> g=(20,21,22,23)
效果走一波
In [7]: def add(n,i):
...: return n+i
...:
...: def test():
...: for i in range(4):
...: yield i
...:
...: g=test()
...: n = 1
...: g=(add(n,i) for i in test())
...: n = 10
...: g=(add(n,i) for i in g)
...:
In [8]: print(list(g))
[20, 21, 22, 23]
执行过程
老哥,麻烦问下文章里那种带有序号的代码框是怎么弄的,是什么编辑文章的插件么?
谢谢。⌇●﹏●⌇
代码高亮的插件~SyntaxHighlighter 了解一下
好,谢谢。
老哥能不能给个链接,我找的几个都用不动。。。
百度第一个就是,http://alexgorbatchev.com/SyntaxHighlighter/