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