发现一个python generator生成器特殊例子,理解了好久

Posted wenmo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了发现一个python generator生成器特殊例子,理解了好久相关的知识,希望对你有一定的参考价值。

技术图片
def scq():
    for i in range(3):
        yield i
g = scq()
for n in [1, 10]:
    g = ((n+k) for k in g)
print(list(g))
View Code

开始代码是这样,光靠眼睛一看觉得结果肯定是[11,12,13]

但是代码一运行却发现结果并不是这样,而是[20,21,22]

这一下子我奇了怪了,为什么比预想的多出了就,后来各种尝试,甚至改了下面for循环的条件,发现只要不动列表的第二个数字,结果就不会发生变化。

后来开了debug一步一步运行,才发现如下原因如下

def scq():
for i in range(3):
yield i
g = scq()
# 第一个生成器 generator1
# 程序按顺序执行下来,在for循环时再次创建两个生成器,
for n in [1, 10]:       # n=1时创建了生成器 generator2,n=10时创建啊第三个生成器 generator3
g = ((n+k) for k in g)

print(list(g)) # 这里调用的是第三个生成器 n=10时创建的生成器 generator3
# 由于生成器的特性,只有被调用时才被执行,所以在这里调用时执行的是g3,而g3调用g2时n=10,g2再调用g

以上是关于发现一个python generator生成器特殊例子,理解了好久的主要内容,如果未能解决你的问题,请参考以下文章

深入浅出学习Python的yield和generator

Python之生成器

python三大神器===》生成器

生成器和迭代器_python

python学习--生成器Generator

Generator - Python 生成器