1-for循环套生成器的面试题

时间:2019-09-16
本文章向大家介绍1-for循环套生成器的面试题,主要包括1-for循环套生成器的面试题使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

参考自:https://www.cnblogs.com/shuimohei/p/9686578.html

题目:

def add(n,i):
    return n+i

def test():
    for i in range(4):
        yield i

g  = test()
for n in [1,10,5]:
    g = (add(n,i) for i in g)


print(list(g))

 分析:

  我们知道生成器函数和生成器表达式都很"懒",只要你不找它取值它就不执行.

  函数从上到下开始执行,一直到13行都没开始,13行list()函数找g要值,9-10行的生成器表达式才开始执行,我们将9-10行拆开:

1 n =1 
2 g = (add(n,i) for i in g)
3 n =10 
4 g = (add(n,i) for i in g)
5 n =5 
6 g = (add(n,i) for i in g)

根据执行顺序,1-4行都是生成器表达式,在13行找此时6行要值的时候,1-4行都还未执行,我们将表达式都写在6行,得到:

1 n =5 
2 g = (add(n,i) for i in (add(n,i) for i in (add(n,i) for i in test())))

从里面往外面执行,

  test() == (0,1,2,3)

  (add(n,i) for i in test()) == (5,6,7,8)

  (add(n,i) for i in (add(n,i) for i in test())) ==(10,11,12,13)

  (add(n,i) for i in (add(n,i) for i in (add(n,i) for i in test()) )) ==(15,16,17,18)

  g=(15,16,17,18)

  list(g) == [15,16,17,18]

  输出结果:

1 [15, 16, 17, 18]

原文地址:https://www.cnblogs.com/summer1019/p/11528710.html