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