色综合老司机第九色激情 _中文字幕日韩av资源站_国产+人+亚洲_久久久精品影院_久久久视频免费观看_欧美激情亚洲自拍_亚洲成av人片在线观看香蕉_热草久综合在线_欧美极品第一页_2020国产精品自拍

千鋒教育-做有情懷、有良心、有品質的職業教育機構

手機站
千鋒教育

千鋒學習站 | 隨時隨地免費學

千鋒教育

掃一掃進入千鋒手機站

領取全套視頻
千鋒教育

關注千鋒學習站小程序
隨時隨地免費學習課程

當前位置:首頁  >  技術干貨  > 什么是python生成器?

什么是python生成器?

來源:千鋒教育
發布人:xqq
時間: 2023-11-07 20:35:11 1699360511

通過列表生成式,我們可以直接創建一個列表,但是,受到內存限制,列表容量肯定是有限的,而且創建一個包含100萬個元素的列表,不僅占用很大的存儲空間,如果我們僅僅需要訪問前面幾個元素,那后面絕大多數元素占用的空間都白白浪費了。

所以,如果列表元素可以按照某種算法推算出來,那我們是否可以在循環的過程中不斷推算出后續的元素呢?這樣就不必創建完整的list,從而節省大量的空間,在Python中,這種一邊循環一邊計算的機制,稱為生成器:generator

生成器是一個特殊的程序,可以被用作控制循環的迭代行為,python中生成器是迭代器的一種,使用yield返回值函數,每次調用yield會暫停,而可以使用next()函數和send()函數恢復生成器。

生成器類似于返回值為數組的一個函數,這個函數可以接受參數,可以被調用,但是,不同于一般的函數會一次性返回包括了所有數值的數組,生成器一次只能產生一個值,這樣消耗的內存數量將大大減小,而且允許調用函數可以很快的處理前幾個返回值,因此生成器看起來像是一個函數,但是表現得卻像是迭代器

python中的生成器

要創建一個generator,有很多種方法,第一種方法很簡單,只有把一個列表生成式的[]中括號改為()小括號,就創建一個generator

舉例如下:

#列表生成式

lis=[x*xforxinrange(10)]

print(lis)

#生成器

generator_ex=(x*xforxinrange(10))

print(generator_ex)

結果:

[0,1,4,9,16,25,36,49,64,81]

at0x000002A4CBF9EBA0>

那么創建list和generator_ex,的區別是什么呢?從表面看就是[]和(),但是結果卻不一樣,一個打印出來是列表(因為是列表生成式),而第二個打印出來卻是at0x000002A4CBF9EBA0>,那么如何打印出來generator_ex的每一個元素呢?

如果要一個個打印出來,可以通過next()函數獲得generator的下一個返回值:

#生成器

generator_ex=(x*xforxinrange(10))

print(next(generator_ex))

print(next(generator_ex))

print(next(generator_ex))

print(next(generator_ex))

print(next(generator_ex))

print(next(generator_ex))

print(next(generator_ex))

print(next(generator_ex))

print(next(generator_ex))

print(next(generator_ex))

print(next(generator_ex))

結果:

Traceback(mostrecentcalllast):

File"列表生成式.py",line42,in

print(next(generator_ex))

StopIteration

大家可以看到,generator保存的是算法,每次調用next(generaotr_ex)就計算出他的下一個元素的值,直到計算出最后一個元素,沒有更多的元素時,拋出StopIteration的錯誤,而且上面這樣不斷調用是一個不好的習慣,正確的方法是使用for循環,因為generator也是可迭代對象:

#生成器

generator_ex=(x*xforxinrange(10))

foriingenerator_ex:

print(i)

結果:

所以我們創建一個generator后,基本上永遠不會調用next(),而是通過for循環來迭代,并且不需要關心StopIteration的錯誤,generator非常強大,如果推算的算法比較復雜,用類似列表生成式的for循環無法實現的時候,還可以用函數來實現。

比如著名的斐波那契數列,除第一個和第二個數外,任何一個數都可以由前兩個相加得到:

1,1,2,3,5,8,12,21,34.....

斐波那契數列用列表生成式寫不出來,但是,用函數把它打印出來卻很容易:

#fibonacci數列

deffib(max):

n,a,b=0,0,1

whilen

a,b=b,a+b

n=n+1

print(a)

return'done'

a=fib(10)

print(fib(10))

a,b=b,a+b其實相當于t=a+b,a=b,b=t,所以不必寫顯示寫出臨時變量t,就可以輸出斐波那契數列的前N個數字。上面輸出的結果如下:

仔細觀察,可以看出,fib函數實際上是定義了斐波拉契數列的推算規則,可以從第一個元素開始,推算出后續任意的元素,這種邏輯其實非常類似generator。

也就是說上面的函數也可以用generator來實現,上面我們發現,print(b)每次函數運行都要打印,占內存,所以為了不占內存,我們也可以使用生成器,這里叫yield。如下:

deffib(max):

n,a,b=0,0,1

whilen

yieldb

a,b=b,a+b

n=n+1

return'done'

a=fib(10)

print(fib(10))

但是返回的不再是一個值,而是一個生成器,和上面的例子一樣,大家可以看一下結果:

那么這樣就不占內存了,這里說一下generator和函數的執行流程,函數是順序執行的,遇到return語句或者最后一行函數語句就返回。而變成generator的函數,在每次調用next()的時候執行,遇到yield語句返回,再次被next()調用時候從上次的返回yield語句處急需執行,也就是用多少,取多少,不占內存。

deffib(max):

n,a,b=0,0,1

whilen

yieldb

a,b=b,a+b

n=n+1

return'done'

a=fib(10)

print(fib(10))

print(a.__next__())

print(a.__next__())

print(a.__next__())

print("可以順便干其他事情")

print(a.__next__())

print(a.__next__())

結果:

可以順便干其他事情

在上面fib的例子,我們在循環過程中不斷調用yield,就會不斷中斷。當然要給循環設置一個條件來退出循環,不然就會產生一個無限數列出來。同樣的,把函數改成generator后,我們基本上從來不會用next()來獲取下一個返回值,而是直接使用for循環來迭代:

deffib(max):

n,a,b=0,0,1

whilen

yieldb

a,b=b,a+b

n=n+1

return'done'

foriinfib(6):

print(i)

結果:

但是用for循環調用generator時,發現拿不到generator的return語句的返回值。如果拿不到返回值,那么就會報錯,所以為了不讓報錯,就要進行異常處理,拿到返回值,如果想要拿到返回值,必須捕獲StopIteration錯誤,返回值包含在StopIteration的value中:

deffib(max):

n,a,b=0,0,1

whilen

yieldb

a,b=b,a+b

n=n+1

return'done'

g=fib(6)

whileTrue:

try:

x=next(g)

print('generator:',x)

exceptStopIterationase:

print("生成器返回值:",e.value)

break

結果:

generator:1

generator:1

generator:2

generator:3

generator:5

generator:8

生成器返回值:done

還可以通過yield實現在單線程的情況下實現并發運算的效果

由上面的例子我么可以發現,python提供了兩種基本的方式

生成器函數:也是用def定義的,利用關鍵字yield一次性返回一個結果,阻塞,重新開始

生成器表達式:返回一個對象,這個對象只有在需要的時候才產生結果

以上內容為大家介紹了什么是python生成器?,希望對大家有所幫助,如果想要了解更多Python相關知識,請關注IT培訓機構:千鋒教育。

tags: python培訓
聲明:本站稿件版權均屬千鋒教育所有,未經許可不得擅自轉載。
10年以上業內強師集結,手把手帶你蛻變精英
請您保持通訊暢通,專屬學習老師24小時內將與您1V1溝通
免費領取
今日已有369人領取成功
劉同學 138****2860 剛剛成功領取
王同學 131****2015 剛剛成功領取
張同學 133****4652 剛剛成功領取
李同學 135****8607 剛剛成功領取
楊同學 132****5667 剛剛成功領取
岳同學 134****6652 剛剛成功領取
梁同學 157****2950 剛剛成功領取
劉同學 189****1015 剛剛成功領取
張同學 155****4678 剛剛成功領取
鄒同學 139****2907 剛剛成功領取
董同學 138****2867 剛剛成功領取
周同學 136****3602 剛剛成功領取
相關推薦HOT
色综合老司机第九色激情 _中文字幕日韩av资源站_国产+人+亚洲_久久久精品影院_久久久视频免费观看_欧美激情亚洲自拍_亚洲成av人片在线观看香蕉_热草久综合在线_欧美极品第一页_2020国产精品自拍
欧美精品色综合| 久久综合色一综合色88| 亚洲韩国一区二区三区| 成人午夜视频福利| 美女诱惑一区二区| 色综合欧美在线视频区| 国产精品资源在线| 奇米精品一区二区三区四区| 日韩一区二区三区三四区视频在线观看| 精品少妇一区二区三区在线视频| hitomi一区二区三区精品| 精品一区二区三区免费观看| 午夜一区二区三区在线观看| 欧美在线观看一区| 国产一区二区三区四| 免费精品视频最新在线| 亚洲一区在线观看网站| 国产成a人无v码亚洲福利| 日韩欧美电影在线| 热久久久久久久| 欧美群妇大交群中文字幕| 久久久www成人免费无遮挡大片 | 麻豆精品视频在线| 亚洲另类春色国产| 精品国产乱码久久久久久图片| av电影天堂一区二区在线观看| 亚洲人成网站在线| 中文字幕av一区二区三区免费看 | 欧美视频一区二区| 亚洲色图.com| 精品成人一区二区三区四区| 亚洲丝袜美腿综合| 亚洲男帅同性gay1069| 肉肉av福利一精品导航| 欧美日韩国产另类一区| 欧美裸体一区二区三区| 欧美久久一二区| ww久久中文字幕| 国产精品妹子av| 亚洲一区二区三区中文字幕在线| 亚洲欧洲国产专区| 天使萌一区二区三区免费观看| 亚洲国产成人91porn| 国产一区中文字幕| 欧美伦理影视网| 国产精品免费观看视频| 日本大胆欧美人术艺术动态| 日韩电影免费在线观看网站| 国产一区二区导航在线播放| 色94色欧美sute亚洲线路一ni| 91精品国产一区二区三区蜜臀| 亚洲在线免费播放| 国产精品久久久爽爽爽麻豆色哟哟 | 91精选在线观看| 国产精品初高中害羞小美女文| 日本不卡123| 欧美日韩激情在线| 亚洲日韩欧美一区二区在线| 国产91在线看| 中文一区二区完整视频在线观看| 美女网站色91| 久久精品男人的天堂| 精品国产乱码久久久久久1区2区| 麻豆精品视频在线观看| 日韩精品一区二区三区三区免费 | 91一区二区在线| 亚洲图片欧美视频| 精品人在线二区三区| 99国产精品久| 美女视频第一区二区三区免费观看网站 | 久久99深爱久久99精品| xf在线a精品一区二区视频网站| 高清在线不卡av| 日韩一区欧美二区| 亚洲综合在线五月| 欧美极品另类videosde| 91精品欧美综合在线观看最新 | 成人丝袜高跟foot| 国产麻豆午夜三级精品| 亚洲成人动漫在线观看| 亚洲蜜臀av乱码久久精品蜜桃| 91精品国产91久久综合桃花| 91色porny蝌蚪| 99久久伊人网影院| 91老司机福利 在线| 99视频在线精品| 不卡电影免费在线播放一区| 成人永久aaa| 欧美在线色视频| 欧美福利一区二区| 欧美日本高清视频在线观看| 欧美一a一片一级一片| 制服丝袜国产精品| 久久这里只有精品6| 国产欧美一区二区精品性色| 欧美国产综合色视频| 尤物在线观看一区| 麻豆精品国产91久久久久久| 风间由美一区二区三区在线观看 | 国产女人水真多18毛片18精品视频| 精品福利在线导航| 亚洲欧美另类图片小说| 日韩成人伦理电影在线观看| 丰满少妇在线播放bd日韩电影| 欧美亚日韩国产aⅴ精品中极品| 日韩精品资源二区在线| 亚洲综合在线观看视频| 懂色中文一区二区在线播放| 制服丝袜亚洲播放| 亚洲一区二区三区精品在线| 国产成人免费视频网站| 欧美精品一区二区三区很污很色的| 一区二区三区中文字幕电影 | 顶级嫩模精品视频在线看| 欧美日本在线播放| 亚洲午夜一区二区| 精品视频在线免费| 另类成人小视频在线| 日韩午夜在线观看| 国产在线精品视频| 欧美激情在线一区二区三区| 国产在线播精品第三| 国产精品毛片久久久久久| 粉嫩绯色av一区二区在线观看| 欧美高清在线一区| 欧日韩精品视频| 精品一区二区三区在线视频| 国产免费观看久久| 91在线免费播放| 精彩视频一区二区| 亚洲成人综合网站| 亚洲欧洲av一区二区三区久久| 精品污污网站免费看| 99麻豆久久久国产精品免费| 免费观看30秒视频久久| 亚洲理论在线观看| 日韩理论电影院| 成人免费在线视频观看| 91精品国产综合久久福利| 欧美天堂亚洲电影院在线播放| 国产福利不卡视频| 精品一区二区三区在线播放| 日韩高清国产一区在线| 亚洲国产精品麻豆| 尤物av一区二区| 日日欢夜夜爽一区| 精品亚洲aⅴ乱码一区二区三区| 夜夜嗨av一区二区三区中文字幕 | 26uuu精品一区二区在线观看| 国产精品天干天干在线综合| 欧美xxxx老人做受| 久久久精品2019中文字幕之3| 91在线国产观看| 91麻豆精品视频| 欧美久久一二三四区| 精品国产91久久久久久久妲己 | 国产精品护士白丝一区av| 久久综合久久久久88| 久久婷婷久久一区二区三区| 综合久久给合久久狠狠狠97色| 亚洲欧美激情一区二区| 日韩中文字幕1| 9i看片成人免费高清| 在线不卡一区二区| 亚洲精品成人在线| 国产精品自在在线| 欧美三级在线播放| **网站欧美大片在线观看| 日本aⅴ精品一区二区三区 | 紧缚奴在线一区二区三区| 一区二区视频在线看| 日本成人在线网站| 99热这里都是精品| 国产精品天干天干在线综合| 视频一区在线播放| 91免费版在线看| 中文字幕制服丝袜成人av| 国产在线一区二区综合免费视频| 欧美色大人视频| 性做久久久久久| 欧美日韩一区高清| 日韩电影在线观看一区| 制服丝袜日韩国产| 国产精品亚洲午夜一区二区三区| 日韩美女在线视频| eeuss鲁片一区二区三区在线看| 国产色一区二区| 99久久夜色精品国产网站| 日本一区二区三区四区在线视频 | 成人激情免费视频| 亚洲欧美日韩国产综合在线| 色丁香久综合在线久综合在线观看| 一区二区三区日韩精品| 日韩视频免费观看高清完整版 | 国产欧美日韩中文久久| 成人黄色片在线观看| 三级久久三级久久| 亚洲一区二区视频在线观看| 亚洲国产精品激情在线观看| 678五月天丁香亚洲综合网|