学习不是填满水桶, 而是点燃火焰! Education is not the filling of a pail but the lighting of a fire@叶芝 (爱尔兰诗人)

关于生成器的几个小面试题

Python 2018-05-13 浏览量: 794 字数统计: 428 最后更新: 2018-05-13 22:57

文章目录[显示]

第一个

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 是一个生成器表达式,而且已经都取出来了,所以 已经没有值了

执行的顺序是这样的

20180512165353.png

看效果,走一个

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]

执行过程

20180512170023.png

小蜗牛 说:
Freedom is the source from which all meaning and all values spring .


文章版权归 原文作者所有丨本站默认采用CC-BY-NC-SA 4.0协议进行授权| 转载必须包含本声明,并以超链接形式注明原文作者和本文原始地址: https://www.tougetu.com/2018/05/python-generator-2.html

5 条评论

  1. 幻想家

    老哥,麻烦问下文章里那种带有序号的代码框是怎么弄的,是什么编辑文章的插件么?
    谢谢。⌇●﹏●⌇

    1. 小蜗牛

      代码高亮的插件~SyntaxHighlighter 了解一下

      1. 幻想家

        好,谢谢。

  2. 幻想家

    老哥能不能给个链接,我找的几个都用不动。。。

    1. 小蜗牛

添加新评论

代码 Pastebin Gist 加粗 删除线 斜体 链接 签到