python 生成器笔记
在做牛客網上的python第一道題的時候就蒙了,看來還是生成器沒學好。
題目如下:
這里回顧下生成器的知識,基礎的就不說了,就一點:就是generator和函數的執行流程不一樣。函數是順序執行,遇到return語句或者最后一行函數語句就返回。而變成generator的函數,在每次調用next()的時候執行,遇到yield語句返回,再次執行時從上次返回的yield語句處繼續執行。
下面舉幾個例子:
def bar_1(n):m=nfor i in range(3):m+=1yield m print 'i am here'a=bar_1(3) # 在每次調用next()的時候執行,遇到yield語句返回,再次執行時從上次返回的yield語句處繼續執行 print 'a:',a.next()輸出結果:
a: 4因為生成器只有在調用next()的時候執行,這里調用后遇到yield就返回了結果4,而下面沒有繼續調用next(),所以執行就此結束。
def bar_2(n):m=nfor i in range(5):m+=1yield m print 'i am here'a=bar_2(3) for i in range(3):print i,'->',a.next()運行結果:
0 -> 4 1 -> i am here 5 2 -> i am here 6這里在for中循環調用3次next(),也就是在遇到yield返回后,因為再次調用next()而繼續執行下面的語句。這里要注意的是1 -> i am here和5是在for i in range(3)`中一次循環中執行的。
def bar_4(n):m=nfor i in range(5):m+=1yield m print 'i am here'a=bar_4(3) for i in a:print 'i->',i運行結果:
i-> 4 i am here i-> 5 i am here i-> 6 i am here i-> 7 i am here i-> 8 i am here從結果可以看出,直接用for循環來遍歷生成器對象更方便,打印出的結果也很清晰,也即是for i in range(5)執行完所有的循環,不再受到外部循環的邊界限制。
def bar_5(n):m=nfor i in range(6):m+=1yield m print 'i->',i b = bar_5(5)print 'b=',b.next()a=bar_5(3) for i in a:pass運行結果:
i-> 0 b= 6 i-> 1 b= 6 i-> 2 b= 6 i-> 3 b= 6 i-> 4 b= 6 i-> 5 b= 6我的理解是,這里每次執行b = bar_5(5)后遇到yield就中斷,遇到b.next()后就打印首元素后而結束。這里的總體循環次數是根據for i in range(6)而定。
下面就是運行題目的程序了:
def bar_5(n):m=nwhile True:m+=1yield m b = bar_5(3)print b.next()a=bar_5(1) for i in a:pass運行結果:
4 4 4 4 4 4 4 4 4 4 4 4 4 ...這里由于控制循環次數的是while True,所以是死循環,而每次打印的是生成器b的首元素,也既是4。
以上是查資料加自己的理解,如有錯誤,還望指正。
總結
以上是生活随笔為你收集整理的python 生成器笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 双色球中奖号码的规则是什么?
- 下一篇: 如何清洗厨房里的顽固油污?