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é)過一種方式叫生成器表達(dá)式,例如:
g1 = (x*2 for x in range(5)) next(g1) 0 next(g1) 2 ...
這就不說了。
- 生成器函數(shù)
生成器函數(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]
這個(gè)yield很牛逼,和return一樣,遇到之后就返回后面的值,但是yield會(huì)記住當(dāng)時(shí)執(zhí)行到哪里了,下一次執(zhí)行從這個(gè)地方開始(就是生成器的特點(diǎn))。
生成器函數(shù)的語法糖
就是yield from 語法,一種看起來簡(jiǎn)潔的表達(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語句
生成器
- 生成器是可以動(dòng)態(tài)(循環(huán)一次計(jì)算一次返回一次)提供數(shù)據(jù)的可迭代對(duì)象(所以屬于可迭代對(duì)象,即有__iter__()和__next__())
- 不必創(chuàng)建容器存儲(chǔ)完整的結(jié)果,而節(jié)省內(nèi)存空間(延遲/惰性操作)
- 含有yield語句的函數(shù)為生成器函數(shù),返回值為生成器對(duì)象
普通可迭代對(duì)象和生成器對(duì)比
定義函數(shù),獲取列表中所有偶數(shù)
list01 = [4,54,65,6,76,87,9] #傳統(tǒng)方式 def get_even01(): #做一個(gè)容器來存儲(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來迭代re,因?yàn)樯善饕彩强傻鷮?duì)象(有__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é)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
深入解析python項(xiàng)目引用運(yùn)行路徑
這篇文章主要介紹了python項(xiàng)目引用運(yùn)行路徑的問題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-05-05
pycharm中import呈現(xiàn)灰色原因的解決方法
這篇文章主要介紹了pycharm中import呈現(xiàn)灰色原因的解決方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03
Python Django搭建文件下載服務(wù)器的實(shí)現(xiàn)
這篇文章主要介紹了Python Django搭建文件下載服務(wù)器的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05
Python?mxnet包成功安裝詳細(xì)指南(避免踩坑+報(bào)錯(cuò))
這篇文章主要給大家介紹了關(guān)于Python?mxnet包成功安裝的相關(guān)資料,包括創(chuàng)建Python環(huán)境、激活環(huán)境、安裝MXNet及其依賴項(xiàng),以及在PythonCharm中配置Python解釋器,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2024-12-12
python的pytest框架之命令行參數(shù)詳解(上)
這篇文章主要介紹了python的pytest框架之命令行參數(shù)詳解,pytest是一款強(qiáng)大的python自動(dòng)化測(cè)試工具,可以勝任各種類型或者級(jí)別的軟件測(cè)試工作。pytest提供了豐富的功能,包括assert重寫,第三方插件,需要的朋友可以參考下2019-06-06
Python+pyqt實(shí)現(xiàn)即時(shí)進(jìn)制轉(zhuǎn)換計(jì)算器
在數(shù)字系統(tǒng)廣泛應(yīng)用的今天,快速準(zhǔn)確地實(shí)現(xiàn)二進(jìn)制和十進(jìn)制之間的轉(zhuǎn)換是程序員和工程師的常見需求,本文將使用Python和pyqt實(shí)現(xiàn)即時(shí)進(jìn)制轉(zhuǎn)換計(jì)算器,需要的小伙伴可以了解下2025-09-09

