Python生成器之yield詳解
yield
為了搞清楚 yield 和 return 這兩者的區(qū)別,我們先來(lái)看一個(gè)簡(jiǎn)單的例子:
>>> def self_return(n):
... print('rocky')
... while n > 0:
... print('before return')
... return n
... n -= 1
... print('after return')
...
>>> s = self_return(3)
rocky
before return
>>> s
3
從上面的例子中函數(shù) self_return(n) 被調(diào)用的過(guò)程中我們可以清晰的看出,s = self_return(3) 函數(shù)體內(nèi)的語(yǔ)句就開始執(zhí)行了,遇到 return 以后將值返回,并結(jié)束在函數(shù)體內(nèi)的執(zhí)行,所以我們看到的結(jié)果是 return 后面的語(yǔ)句根本沒(méi)有執(zhí)行,這個(gè)是 return 的特點(diǎn),不知道你還記得么?如果不記得的話可以去翻我前面的文章。
下面我們來(lái)將 return 換乘 yield ,再來(lái)試試看:
>>> def self_yield(n):
... print('rocky')
... while n > 0:
... print('before yield')
... yield n
... n -= 1
... print('after yield')
...
>>> s = self_yield(3)
>>> s.__next__()
rocky
before yield
3
仔細(xì)觀察上面的例子你會(huì)發(fā)現(xiàn),s = self_yield(n) 并沒(méi)有去執(zhí)行函數(shù)體內(nèi)的語(yǔ)句,且 s.next() 的時(shí)候遇到 yield 的時(shí)候,會(huì)返回值,并且暫停。我們接著再繼續(xù)來(lái)試一下:
>>> s.__next__() after yield before yield 2 >>> s.__next__() after yield before yield 1 >>> s.__next__() after yield Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration
通過(guò)上面的繼續(xù)操作,我們可以看到每次遇到 yield 的時(shí)候都會(huì)返回值,并且暫停,下次再執(zhí)行的時(shí)候是從上次暫停的位置開始又繼續(xù)執(zhí)行的,當(dāng)沒(méi)有滿足條件的值,就會(huì)拋出異常。
結(jié)合上面的分析和對(duì)用例的執(zhí)行結(jié)果,相信你已經(jīng)你已經(jīng)理解了 yield 的特點(diǎn),也知道它與 return 之間的區(qū)別了:一般的函數(shù),都是止于 return;作為生成器的函數(shù),因?yàn)橛辛?yield,則遇到它會(huì)掛起。
下面我想再用一個(gè)例子來(lái)具體的闡述一下。斐波那契數(shù)列相信你們已經(jīng)不陌生了,我在前面的文章中不止一次的提過(guò)它,這次我們嘗試將 yield 應(yīng)用到斐波那契數(shù)列中:
def fibs(max):
"""
fibonacci sequence generator
"""
n, a, b = 0, 0, 1
while n < max:
yield b
a, b = b, a + b
n += 1
if __name__ == "__main__":
f = fibs(9)
for i in f:
print(i,end = ' ')
上述代碼的運(yùn)行結(jié)果如下:
1 1 2 3 5 8 13 21 34 55
你看,用生成器生成的斐波那契數(shù)列是不是跟以前的不一樣了呢?如果有興趣的話,你可以將我在前面文章中演示過(guò)的斐波那契數(shù)列的實(shí)現(xiàn)方式和現(xiàn)在的做一下對(duì)比,然后仔細(xì)觀察一下差異之處。
經(jīng)過(guò)這幾次的各種演示,其實(shí)已經(jīng)很明確了:在一個(gè)函數(shù)中如果有了 yield 語(yǔ)句,那么它就是生成器,即也是迭代器。這種方式比前面寫迭代器的類要簡(jiǎn)便的多,但這不是說(shuō)迭代器不好,無(wú)論是使用迭代器還是生成器都要具體問(wèn)題具體分析。
到此這篇關(guān)于Python生成器之yield詳解的文章就介紹到這了,更多相關(guān)Python yield內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python UnicodeEncodeError: ''gbk'' codec can''t encode chara
這篇文章主要介紹了Python UnicodeEncodeError: 'gbk' codec can't encode character 解決方法,需要的朋友可以參考下2015-04-04
python代碼實(shí)現(xiàn)將列表中重復(fù)元素之間的內(nèi)容全部濾除
這篇文章主要介紹了python代碼實(shí)現(xiàn)將列表中重復(fù)元素之間的內(nèi)容全部濾除,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05
用實(shí)例詳解Python中的Django框架中prefetch_related()函數(shù)對(duì)數(shù)據(jù)庫(kù)查詢的優(yōu)化
這篇文章主要介紹了用實(shí)例詳解Python中的Django框架中prefetch_related()函數(shù)對(duì)數(shù)據(jù)庫(kù)查詢的優(yōu)化,可減少對(duì)數(shù)據(jù)庫(kù)的查詢次數(shù)從而優(yōu)化性能,需要的朋友可以參考下2015-04-04
Python?計(jì)算機(jī)視覺(jué)編程進(jìn)階之圖像特效處理篇
計(jì)算機(jī)視覺(jué)這種技術(shù)可以將靜止圖像或視頻數(shù)據(jù)轉(zhuǎn)換為一種決策或新的表示。所有這樣的轉(zhuǎn)換都是為了完成某種特定的目的而進(jìn)行的,本篇我們來(lái)學(xué)習(xí)下如何對(duì)圖像進(jìn)行特效處理2021-11-11

