日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python 生成器笔记

發布時間:2024/9/20 python 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 生成器笔记的全部內容,希望文章能夠幫你解決所遇到的問題。

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