Python生成器generator和yield關(guān)鍵字的使用
Python生成器generator和yield關(guān)鍵字

生成器 generator 是一個返回迭代器的函數(shù),只能用于迭代操作,更簡單點理解生成器就是一個迭代器。
實現(xiàn)生成器有兩種方式:
第一:將列表推導(dǎo)式種的 [] 改成 ()
a=[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], ["a","b","c","d","e","f","g","h","i","j"], ["A","B","C","D","E","F","G","H","I","J"]] res=(tmp for ele in a for tmp in ele ) type(res)
可以看出 res 已經(jīng)是一個生成器了

那么使用生成器有什么用途呢?
1)迭代器能做的,它也能做,例如 next() 方法

2) 也可以使用 for 循環(huán)

3)最重要的是,它是隨用隨取的,不會像列表生成式 [] 那樣一下子全生成,只是在迭代時候才會生成(雖然對于用戶而言,遍歷時候可能感受不到)。
第二:使用 yield 關(guān)鍵字
yield 關(guān)鍵字是很特殊的,一個函數(shù)里有了 yield 后,執(zhí)行到 yield 就會停住,下載再次調(diào)用時繼續(xù)從上一次中斷的位置繼續(xù)執(zhí)行代碼并返回值。所以生成器函數(shù)即使是有無限循環(huán)也沒關(guān)系,它需要算到多少就會算多少,不需要就不往下算。
請注意,有 yield 關(guān)鍵字的函數(shù)不是生成器,是該函數(shù)的運(yùn)行結(jié)果是一個生成器!
先說說最簡單的情況
我先創(chuàng)建一個函數(shù) f ,依次生成100以內(nèi)的數(shù), 使用 type 函數(shù)可以看到這是一個 function
def f():
i=0
yield i
while(i<100):
i+=1
yield i
那么執(zhí)行這個函數(shù)呢
res=f()type(res)
這個函數(shù)執(zhí)行的結(jié)果是一個生成器!

對這個返回的生成器,可以使用 next() 方法

使用生成器解決實際問題,例如常見的斐波拉契數(shù)列。
斐波拉契數(shù)列:指的是這樣一個數(shù)列:1、1、2、3、5、8、13、21、34、……在數(shù)學(xué)上,斐波那契數(shù)列以如下被以遞推的方法定義:F(0)=0,F(xiàn)(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*)
1) 一個簡單的無線循環(huán)的 fib 生成器
def fib():
a=[0,1]
yield a[0]
yield a[1]
while True:
tmp=a[0]+a[1]
a=[a[1],a[0]+a[1]]
yield tmp運(yùn)行結(jié)果是

2)一個有限循環(huán)的(n 次數(shù))的 fib 生成器
def fib(n):
i=0
a,b=0,1
yield a
while(i<n):
a,b=b,a+b
i+=1
yield a運(yùn)行結(jié)果如下,當(dāng)?shù)螖?shù)小于等于 n 時候,可以輸出相應(yīng)的數(shù)列數(shù),大于 n 時候則報錯。

3)斐波拉契數(shù)列的一個變形,即返回包含前 n 個 數(shù)的列表
理論上1)2) 都可以實現(xiàn),但是有一個額外要求,即不需要反復(fù)去從 1 計算起。
使用 1) 中無限循環(huán)函數(shù)
%%time
# 一個簡單的無線循環(huán)的,生成fib 數(shù)列的生成器
def fib():
a=[0,1]
yield a[0]
yield a[1]
while True:
tmp=a[0]+a[1]
a=[a[1],a[0]+a[1]]
yield tmp
# 只要前 n 個 fib 數(shù)字
i=0
n=10
res=[]
gen=fib()
# 簡單的 while 循環(huán) 因為使用next 不需要重復(fù)計算
while(i<n):
res.append(next(gen))
i+=1
res
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python正則表達(dá)式常用函數(shù)總結(jié)
這篇文章主要介紹了Python正則表達(dá)式常用函數(shù),結(jié)合實例形式總結(jié)分析了Python正則表達(dá)式常用函數(shù)功能、使用方法及相關(guān)注意事項,需要的朋友可以參考下2017-06-06
詳解Python如何利用Pandas與NumPy進(jìn)行數(shù)據(jù)清洗
許多數(shù)據(jù)科學(xué)家認(rèn)為獲取和清理數(shù)據(jù)的初始步驟占工作的 80%,花費(fèi)大量時間來清理數(shù)據(jù)集并將它們歸結(jié)為可以使用的形式。本文將利用 Python 的 Pandas和 NumPy 庫來清理數(shù)據(jù),需要的可以參考一下2022-04-04
Python實現(xiàn)Windows鍵盤鼠標(biāo)自動化模擬器
這篇文章主要為大家詳細(xì)介紹了一個基于Python的Windows鍵盤鼠標(biāo)自動化模擬器,適合自動化測試、游戲輔助等場景,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-10-10

