何时使用生成器呢,当你不想一次性把全部值都列出来,要一个个调用的时候。面试
# yield执行的模式 def gen(): print('start') m = yield 2 # 能够看做yield返回值为2,send(3)把3传递给m,并调用,m变成3了,同下 print(m) n = yield 3 print(n) # try: # g = gen() # print(g.__next__()) # print(g.send('m 是多少呢')) # except StopIteration: # pass try: g = gen() #此时不运行gen()函数,若print(g) 会打印该生成器的内存地址 print(g.send(None)) #至关于 g.__next__(),执行了这一步,首先打印了 start,接着打印 yield返回值 2,而后函数暂停 print(g.send(6666)) print(g.send(3333)) except StopIteration as e: print(e.value) # yield获取移动平均值 def avr(num): count = 0 for i in range(num): count +=i if i: arg = count/(i+1) yield arg ret = avr(5) for i in ret: print(i) print(ret) #获取移动平均值 真 def average(): sum,avg,count = 0,0,0 while True: num = yield avg sum += num count += 1 avg = sum/count avg_g = average() print(avg_g.__next__()) print(avg_g.send(10)) print(avg_g.send(20))
两道面试题:ide
之后但凡碰到for循环套生成器,就拆开来作,好比后一题函数
1 # def demo(): 2 # for i in range(4): 3 # yield i 4 # 5 # g=demo() 6 # #生成式表达式 7 # g1=(i for i in g) #g1也是个生成器,可是直到调用list(g1)才运行g1里的语句,而后把调用到g的值,悉数给了list,此时g1做为生成器,取到头了,没值了 8 # g2=(i for i in g1) #当list(g2)向g1要值得时候,g1没东西给它 9 # 10 # print(list(g1)) #[0,1,2,3] 11 # print(list(g2)) 12 >>
[0, 1, 2, 3]
[]
13 def add(n,i): 14 return n+i 15 16 def test(): 17 for i in range(4): 18 yield i 19 20 g=test() 21 for n in [1,10]: 22 g=(add(n,i) for i in g) #先执行 for i in g ,再执行 add函数 23 24 print(list(g)) 25
>>>[20, 21, 22, 23]
26 # for n in [1,10]: 27 # g=(add(n,i) for i in g) #先执行 for i in g ,再执行 add函数 28 # 能够当作是: 29 # n = 1: 执行g=(add(n,i) for i in g) 30 # n = 10:执行g=(add(n,i) for i in g) 31 # 可是g做为生成式表达式,只是一个内存地址,调用不到 32 # 因此此时 n = 10,而后继续往下执行 print(list(g)) 33 # 此时开始调用g,可是执行的是 n = 10:执行g=(add(n,i) for i in g) 同时括号里的g 应该替换为 当 n=1的时候,执行的g 34 # 也就是 此时执行的是 n = 10: g=(add(10,i) for i in g=(add(10,i) for i in g)) 35 #注意此处 n的变化 36 #而后就变为了 g=(add(10,i) for i in (10,11,12,13)) 37 #最后结果为 [20,21,22,23] 38 39 #若是换成 40 #for n in [1,10,5]: 41 # g=(add(n,i) for i in g) 42 #能够当作: 43 # n = 1: 执行g=(add(n,i) for i in test()) #(0,1,2,3) 44 # n = 10:执行g=(add(n,i) for i in (add(n,i) for i in test())) ) (5,6,7,8) 45 # n = 5:执行g=(add(5,i) for i in (add(n,i) for i in (add(n,i) for i in test())) )) 46 # (10,11,12,13) (5,6,7,8) #(0,1,2,3)>>>>[15,16,17,18]