何時使用生成器呢,當你不想一次性把全部值都列出來,要一個個調用的時候。面試
# 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]