日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

python 生成器笔记

發布時間:2024/9/20 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python 生成器笔记 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在做牛客網上的python第一道題的時候就蒙了,看來還是生成器沒學好。
題目如下:

def bar(n):m=nwhile True:m+=1yield m b = bar(3)print b.next()

這里回顧下生成器的知識,基礎的就不說了,就一點:就是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 生成器笔记的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。