python生成器實(shí)現(xiàn)方法:
生成器和迭代器的功能非常相似,它也會(huì)提供__next__()方法,這意味著程序同樣可調(diào)用內(nèi)置的next()函數(shù)來(lái)獲取生成器的下一個(gè)值,也可使用for循環(huán)來(lái)遍歷生成器。
生成器與迭代器的區(qū)別在于,迭代器通常是先定義一個(gè)迭代器類,然后通過(guò)創(chuàng)建實(shí)例來(lái)創(chuàng)建迭代器;而生成器則是先定義一個(gè)包含yield語(yǔ)句的函數(shù),然后通過(guò)調(diào)用該函數(shù)來(lái)創(chuàng)建生成器。
生成器是一種非常優(yōu)秀的語(yǔ)法,Python使用生成器可以讓程序變得很優(yōu)雅。
創(chuàng)建生成器
創(chuàng)建生成器需要兩步操作:
定義一個(gè)包含yield語(yǔ)句的函數(shù)。
調(diào)用第1步創(chuàng)建的函數(shù)得到生成器。
下面程序使用生成器來(lái)定義一個(gè)差值遞增的數(shù)列。程序先定義了一個(gè)包含yield語(yǔ)句的函數(shù):
deftest(val,step):
print("--------函數(shù)開(kāi)始執(zhí)行------")
cur=0
#遍歷0~val
foriinrange(val):
#cur添加i*step
cur+=i*step
yieldcur
生成器的方法
當(dāng)生成器運(yùn)行起來(lái)之后,開(kāi)發(fā)者還可以為生成器提供值,通過(guò)這種方式讓生成器與“外部程序”動(dòng)態(tài)地交換數(shù)據(jù)。
為了實(shí)現(xiàn)生成器與“外部程序”動(dòng)態(tài)地交換數(shù)據(jù),需要借助于生成器的send()方法,該方法的功能與前面示例中所使用的next()函數(shù)的功能非常相似,它們都用于獲取生成器所生成的下一個(gè)值,并將生成器“凍結(jié)”在yield語(yǔ)句處;但send()方法可以接收一個(gè)參數(shù),該參數(shù)值會(huì)被發(fā)送給生成器函數(shù)。
在生成器函數(shù)內(nèi)部,程序可通過(guò)yield表達(dá)式來(lái)獲取send()方法所發(fā)送的值,這意味著此時(shí)程序應(yīng)該使用一個(gè)變量來(lái)接收yield語(yǔ)句的值。如果程序依然使用next()函數(shù)來(lái)獲取生成器所生成的下一個(gè)值,那么yield語(yǔ)句返回None。
對(duì)于上面詳細(xì)的描述,歸納起來(lái)就是兩句話:
外部程序通過(guò)send()方法發(fā)送數(shù)據(jù)。
生成器函數(shù)使用yield語(yǔ)句接收收據(jù)。
以上內(nèi)容為大家介紹了python培訓(xùn)之生成器如何實(shí)現(xiàn),希望對(duì)大家有所幫助,如果想要了解更多Python相關(guān)知識(shí),請(qǐng)關(guān)注IT培訓(xùn)機(jī)構(gòu):千鋒教育。