Python之生成器
-
生成器
- 在Python社區(qū),生成器和迭代器被看作一種工具弥锄,生成器的本質(zhì)就是迭代器。唯一的區(qū)別就是生成器是開發(fā)人員自己用Python代碼構(gòu)建的數(shù)據(jù)結(jié)構(gòu)温治,而迭代器是Python內(nèi)置提供或轉(zhuǎn)化而來的戒悠。
-
獲取生成器
獲取生成器有3種方式:
-
通過生成器函數(shù)獲取生成器
只要函數(shù)中使用了
yield
關(guān)鍵字,這個(gè)函數(shù)就是生成器函數(shù)绸狐,生成器函數(shù)使用函數(shù)名稱()
不執(zhí)行生成器函數(shù)累盗。在生成器函數(shù)內(nèi)部突琳,通過關(guān)鍵字yield
生成需要返回的值;生成器函數(shù)外拆融,通過next(調(diào)用生成器函數(shù))
來獲取一個(gè)yield
的值,獲取yield
值的過程中挪凑,執(zhí)行yield
關(guān)鍵字之上的所有代碼逛艰,直到遇到yield
停止代碼的執(zhí)行(但不會(huì)結(jié)束函數(shù)),返回yield
的值散怖,注意,使用一個(gè)next(調(diào)用函數(shù))
咬最,對(duì)應(yīng)獲取一個(gè)yield
值欠动。def func(): print('Python') yield '第一個(gè)yield' print('生成器') yield '第二個(gè)yield' a = 1 b = 2 c = a + b print(c) yield '第三個(gè)yield' ret = func() print(next(ret)) # 輸出結(jié)果:第一個(gè)yield print(next(ret)) ''' 輸出結(jié)果: Python生成器 第二個(gè)yield ''' print(next(ret)) ''' 輸出結(jié)果: 3 第三個(gè)yield ''' # 如果next()和yield的調(diào)用次數(shù)不對(duì)應(yīng),會(huì)報(bào)錯(cuò)具伍!'StopIteration(停止迭代)' # yiled form def func(): l = [1,2,3,4,5] yield from l # l將作為子生成器為next(ret)返回列表中的單一元素 ret = func() print(next(ret)) print(next(ret)) print(next(ret)) print(next(ret)) print(next(ret)) print(next(ret)) ''' 輸出結(jié)果: 1 2 3 4 5 Traceback (most recent call last): File "C:/Users/BDHT/OneDrive/Python/Python3.8/test.py", line 14, in <module> print(next(ret)) StopIteration '''
-
通過生成器表達(dá)式獲取生成器
生成器表達(dá)式與列表推導(dǎo)式的寫法幾乎一摸一樣人芽,將列表推導(dǎo)式的
[]
換成()
就是生成器表達(dá)式,生成器表達(dá)式也有循環(huán)模式和篩選模式萤厅,多層循環(huán)構(gòu)建。列表推導(dǎo)式與生成器表達(dá)式的區(qū)別在于惕味,生成器表達(dá)式更省內(nèi)存。
# 使用列表推導(dǎo)式生成一個(gè)1到10的列表 l = [i for i in range(1,11)] print(l) # [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] # 使用生成器表達(dá)式生成一個(gè)生成器(迭代器) l = (i for i in range(1,11)) print(l) # <generator object <genexpr> at 0x000002004151AA50> for i in l: print(i) ''' 輸出結(jié)果: 1 2 3 4 5 6 7 8 9 10 '''
Python內(nèi)部提供的一些生成器
-