一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

看完這篇,你就知道Python生成器是什么

 LibraryPKU 2017-11-28

生成器是 Python 初級開發(fā)者最難理解的概念之一,雖被認(rèn)為是 Python 編程中的高級技能,但在各種項(xiàng)目中可以隨處見到生成器的身影,你得不得去理解它、使用它、甚至愛上它。


提到生成器,總不可避免地要把迭代器拉出來對比著講,生成器就是一個在行為上和迭代器非常類似的對象,如果把迭代器比作 Android 系統(tǒng),那么生成器就是 iOS,二者功能上差不多,但是生成器更優(yōu)雅。

什么是迭代器


顧名思義,迭代器就是用于迭代操作(for 循環(huán))的對象,它像列表一樣可以迭代獲取其中的每一個元素,任何實(shí)現(xiàn)了 __next__ 方法 (python2 是 next)的對象都可以稱為迭代器。


它與列表的區(qū)別在于,構(gòu)建迭代器的時候,不像列表把所有元素一次性加載到內(nèi)存,而是以一種延遲計(jì)算(lazy evaluation)方式返回元素,這正是它的優(yōu)點(diǎn)。比如列表含有中一千萬個整數(shù),需要占超過400M的內(nèi)存,而迭代器只需要幾十個字節(jié)的空間。因?yàn)樗]有把所有元素裝載到內(nèi)存中,而是等到調(diào)用 next 方法時候才返回該元素(按需調(diào)用 call by need 的方式,本質(zhì)上 for 循環(huán)就是不斷地調(diào)用迭代器的next方法)。


以斐波那契數(shù)列為例來實(shí)現(xiàn)一個迭代器:

什么是生成器


知道迭代器之后,就可以正式進(jìn)入生成器的話題了。普通函數(shù)用 return 返回一個值,和 Java 等其他語言是一樣的,然而在 Python 中還有一種函數(shù),用關(guān)鍵字 yield 來返回值,這種函數(shù)叫生成器函數(shù),函數(shù)被調(diào)用時會返回一個生成器對象,生成器本質(zhì)上還是一個迭代器,也是用在迭代操作中,因此它有和迭代器一樣的特性,唯一的區(qū)別在于實(shí)現(xiàn)方式上不一樣,后者更加簡潔


最簡單的生成器函數(shù):

func 就是一個生成器函數(shù),調(diào)用該函數(shù)時返回對象就是生成器 g ,這個生成器對象的行為和迭代器是非常相似的,可以用在 for 循環(huán)等場景中。注意 yield 對應(yīng)的值在函數(shù)被調(diào)用時不會立刻返回,而是調(diào)用next方法時(本質(zhì)上 for 循環(huán)也是調(diào)用 next 方法)才返回

那為什么要用生成器呢?顯然,用生成器在逼格上要比迭代器高幾個等級,它沒有那么多冗長代碼了,而且性能上一樣的高效,為什么不用呢?來看看用生成器實(shí)現(xiàn)斐波那契數(shù)列有多簡單。

生成器表達(dá)式


在前面一期「這樣寫代碼更優(yōu)雅」的文章里面曾經(jīng)介紹過列表推導(dǎo)式(list comprehension),生成器表達(dá)式與列表推導(dǎo)式長的非常像,但是它倆返回的對象不一樣,前者返回生成器對象,后者返回列表對象。

前面已經(jīng)介紹過生成器的優(yōu)勢,就是迭代海量數(shù)據(jù)時,顯然生成器更合適。


作者:PythonTab

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    成在线人免费视频一区二区| 亚洲天堂有码中文字幕视频| 国产高清视频一区不卡| 免费大片黄在线观看日本| 人妻熟女欲求不满一区二区| 成年人视频日本大香蕉久久| 美女被后入福利在线观看| 午夜精品在线观看视频午夜| 亚洲黄片在线免费小视频| 亚洲成人黄色一级大片| 日韩午夜老司机免费视频| 熟女一区二区三区国产| 日韩aa一区二区三区| 国产人妻精品区一区二区三区| 久热99中文字幕视频在线| 亚洲少妇一区二区三区懂色| 日韩一区二区三区免费av| 日本91在线观看视频| 日韩午夜老司机免费视频 | 一区二区三区免费公开| 午夜精品福利视频观看| 日韩精品区欧美在线一区| 亚洲午夜av一区二区| 国产精品视频一级香蕉| 午夜国产精品国自产拍av| 日韩一区二区三区嘿嘿| 国产性色精品福利在线观看| 狠狠干狠狠操在线播放| 自拍偷女厕所拍偷区亚洲综合| 在线观看中文字幕91| 中文文精品字幕一区二区| 日韩一本不卡在线观看| 成人日韩视频中文字幕| 日韩蜜桃一区二区三区| 国产免费一区二区三区av大片| 亚洲一区二区精品福利| 亚洲视频一区自拍偷拍另类| 少妇视频一区二区三区| 狠狠做深爱婷婷久久综合| 美女被后入视频在线观看| 91精品国产品国语在线不卡|