<每日一题>题目4:for循环套生成器的面试题

  题目:

 1 def add(n,i):
 2     return n+i
 3 
 4 def test():
 5     for i in range(4):
 6         yield i
 7 
 8 g  = test()
 9 for n in [1,10,5]:
10     g = (add(n,i) for i in g)
11 
12 
13 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]

猜你喜欢

转载自www.cnblogs.com/shuimohei/p/9686578.html