Python的生成器函數(shù)詳解
Python的生成器函數(shù)
生成器的概念
生成器是Python中的一個對象,對這個對象進行操作,可以依次生產出按生成器內部運算產生的數(shù)據。
但是要注意,如果不對生成器進行操作,是不會產生數(shù)據的。
稱這樣的方式為惰性求值,延或者遲求值。
構造生成器
- 生成器表達式
以前學過一種方式叫生成器表達式,例如:
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ù)據的可迭代對象(所以屬于可迭代對象,即有__iter__()和__next__())
- 不必創(chuàng)建容器存儲完整的結果,而節(jié)省內存空間(延遲/惰性操作)
- 含有yield語句的函數(shù)為生成器函數(shù),返回值為生成器對象
普通可迭代對象和生成器對比
定義函數(shù),獲取列表中所有偶數(shù)
list01 = [4,54,65,6,76,87,9] #傳統(tǒng)方式 def get_even01(): #做一個容器來存儲數(shù)據 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
總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
pycharm中import呈現(xiàn)灰色原因的解決方法
這篇文章主要介紹了pycharm中import呈現(xiàn)灰色原因的解決方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-03-03
Python Django搭建文件下載服務器的實現(xiàn)
這篇文章主要介紹了Python Django搭建文件下載服務器的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-05-05
Python?mxnet包成功安裝詳細指南(避免踩坑+報錯)
這篇文章主要給大家介紹了關于Python?mxnet包成功安裝的相關資料,包括創(chuàng)建Python環(huán)境、激活環(huán)境、安裝MXNet及其依賴項,以及在PythonCharm中配置Python解釋器,文中通過圖文介紹的非常詳細,需要的朋友可以參考下2024-12-12
python的pytest框架之命令行參數(shù)詳解(上)
這篇文章主要介紹了python的pytest框架之命令行參數(shù)詳解,pytest是一款強大的python自動化測試工具,可以勝任各種類型或者級別的軟件測試工作。pytest提供了豐富的功能,包括assert重寫,第三方插件,需要的朋友可以參考下2019-06-06

