Python的生成器函數(shù)詳解
Python的生成器函數(shù)
生成器的概念
生成器是Python中的一個(gè)對(duì)象,對(duì)這個(gè)對(duì)象進(jìn)行操作,可以依次生產(chǎn)出按生成器內(nèi)部運(yùn)算產(chǎn)生的數(shù)據(jù)。
但是要注意,如果不對(duì)生成器進(jìn)行操作,是不會(huì)產(chǎn)生數(shù)據(jù)的。
稱這樣的方式為惰性求值,延或者遲求值。
構(gòu)造生成器
- 生成器表達(dá)式
以前學(xué)過(guò)一種方式叫生成器表達(dá)式,例如:
g1 = (x*2 for x in range(5)) next(g1) 0 next(g1) 2 ...
這就不說(shuō)了。
- 生成器函數(shù)
生成器函數(shù),就是說(shuō)定義函數(shù)時(shí),內(nèi)部帶yield就算生成器函數(shù)。
每次返回的值就是yield后面的值,例如:
def g2(): for x in range(5): yield x*2 list(g2) [0, 2, 4, 6, 8]
這個(gè)yield很牛逼,和return一樣,遇到之后就返回后面的值,但是yield會(huì)記住當(dāng)時(shí)執(zhí)行到哪里了,下一次執(zhí)行從這個(gè)地方開(kāi)始(就是生成器的特點(diǎn))。
生成器函數(shù)的語(yǔ)法糖
就是yield from 語(yǔ)法,一種看起來(lái)簡(jiǎn)潔的表達(dá)形式吧。
普通形式的生成器函數(shù):
def inc1(): for x in range(10000): yield x
相當(dāng)于
def inc2(): yield from range(10000)
也就是說(shuō),yield from iterable 相當(dāng)于 yield item for item in iterable。
python生成器和yield語(yǔ)句
生成器
- 生成器是可以動(dòng)態(tài)(循環(huán)一次計(jì)算一次返回一次)提供數(shù)據(jù)的可迭代對(duì)象(所以屬于可迭代對(duì)象,即有__iter__()和__next__())
- 不必創(chuàng)建容器存儲(chǔ)完整的結(jié)果,而節(jié)省內(nèi)存空間(延遲/惰性操作)
- 含有yield語(yǔ)句的函數(shù)為生成器函數(shù),返回值為生成器對(duì)象
普通可迭代對(duì)象和生成器對(duì)比
定義函數(shù),獲取列表中所有偶數(shù)
list01 = [4,54,65,6,76,87,9] #傳統(tǒng)方式 def get_even01(): #做一個(gè)容器來(lái)存儲(chǔ)數(shù)據(jù) result = [] for item in list01: if item % 2 == 0: result.append(item) return result re = get_even01() for item in re: print(item) #使用生成器技術(shù) def get_even02(): for item in list01: if item % 2 == 0: yield item #yield是生成器的關(guān)鍵詞 re = get_even02() #返回一個(gè)生成器對(duì)象 for item in re: #使用for來(lái)迭代re,因?yàn)樯善饕彩强傻鷮?duì)象(有__iter__()方法) print(item)
使用生成器的最大作用是節(jié)省內(nèi)存
yield語(yǔ)句
def f1(): for i in range(2): yield i g = f1() print(g.__next__()) #0 print(g.__next__()) #1 print(g.__next__()) #拋出異常StopIteration #為了不拋出異常,改寫(xiě)上面的代碼 def f1(): for i in range(2): yield i g = f1() while True: try: print(g.__next__()) except Exception as e: #捕獲異常,結(jié)束循環(huán) break
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
python 實(shí)現(xiàn)Flask中返回圖片流給前端展示
今天小編就為大家分享一篇python 實(shí)現(xiàn)Flask中返回圖片流給前端展示,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-01-01Python連接和操作PostgreSQL數(shù)據(jù)庫(kù)的流程步驟
PostgreSQL 是一種開(kāi)源的對(duì)象關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)(ORDBMS),以其強(qiáng)大的功能和穩(wěn)定性而廣受歡迎,本文將詳細(xì)介紹如何使用 Python 連接和操作 PostgreSQL 數(shù)據(jù)庫(kù),需要的朋友可以參考下2024-10-10Python 管理依賴包工具pip, virtualenv詳解
管理依賴包是Python開(kāi)發(fā)中不可或缺的一部分,通過(guò)pip、virtualenv和pipenv等工具,我們可以有效地管理包和虛擬環(huán)境,確保項(xiàng)目的可移植性和一致性,這篇文章主要介紹了Python 管理依賴包(pip, virtualenv),需要的朋友可以參考下2024-07-07Python中rasterio庫(kù)的實(shí)現(xiàn)
Rasterio是一個(gè)用于讀寫(xiě)光柵數(shù)據(jù)的Python庫(kù),它專注于快速和可靠地處理大規(guī)模地理空間柵格數(shù)據(jù),本文主要介紹了Python中rasterio庫(kù)的實(shí)現(xiàn),感興趣的可以了解一下2025-04-04matplotlib設(shè)置顏色、標(biāo)記、線條,讓你的圖像更加豐富(推薦)
這篇文章主要介紹了matplotlib設(shè)置顏色、標(biāo)記、線條,讓你的圖像更加豐富,本文通過(guò)實(shí)例圖文相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09Python操作Redis之設(shè)置key的過(guò)期時(shí)間實(shí)例代碼
這篇文章主要介紹了Python操作Redis之設(shè)置key的過(guò)期時(shí)間實(shí)例代碼,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01