Python生成器之yield詳解
yield
為了搞清楚 yield 和 return 這兩者的區(qū)別,我們先來看一個簡單的例子:
>>> 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)用的過程中我們可以清晰的看出,s = self_return(3) 函數(shù)體內(nèi)的語句就開始執(zhí)行了,遇到 return 以后將值返回,并結(jié)束在函數(shù)體內(nèi)的執(zhí)行,所以我們看到的結(jié)果是 return 后面的語句根本沒有執(zhí)行,這個是 return 的特點,不知道你還記得么?如果不記得的話可以去翻我前面的文章。
下面我們來將 return 換乘 yield ,再來試試看:
>>> 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ì)觀察上面的例子你會發(fā)現(xiàn),s = self_yield(n) 并沒有去執(zhí)行函數(shù)體內(nèi)的語句,且 s.next() 的時候遇到 yield 的時候,會返回值,并且暫停。我們接著再繼續(xù)來試一下:
>>> 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
通過上面的繼續(xù)操作,我們可以看到每次遇到 yield 的時候都會返回值,并且暫停,下次再執(zhí)行的時候是從上次暫停的位置開始又繼續(xù)執(zhí)行的,當(dāng)沒有滿足條件的值,就會拋出異常。
結(jié)合上面的分析和對用例的執(zhí)行結(jié)果,相信你已經(jīng)你已經(jīng)理解了 yield 的特點,也知道它與 return 之間的區(qū)別了:一般的函數(shù),都是止于 return;作為生成器的函數(shù),因為有了 yield,則遇到它會掛起。
下面我想再用一個例子來具體的闡述一下。斐波那契數(shù)列相信你們已經(jīng)不陌生了,我在前面的文章中不止一次的提過它,這次我們嘗試將 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ù)列是不是跟以前的不一樣了呢?如果有興趣的話,你可以將我在前面文章中演示過的斐波那契數(shù)列的實現(xiàn)方式和現(xiàn)在的做一下對比,然后仔細(xì)觀察一下差異之處。
經(jīng)過這幾次的各種演示,其實已經(jīng)很明確了:在一個函數(shù)中如果有了 yield 語句,那么它就是生成器,即也是迭代器。這種方式比前面寫迭代器的類要簡便的多,但這不是說迭代器不好,無論是使用迭代器還是生成器都要具體問題具體分析。
到此這篇關(guān)于Python生成器之yield詳解的文章就介紹到這了,更多相關(guān)Python yield內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于tensorflow for循環(huán) while循環(huán)案例
這篇文章主要介紹了基于tensorflow for循環(huán) while循環(huán)案例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06Python中Timedelta轉(zhuǎn)換為Int或Float方式
這篇文章主要介紹了Python中Timedelta轉(zhuǎn)換為Int或Float方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-07-07python實現(xiàn)可以斷點續(xù)傳和并發(fā)的ftp程序
斷點續(xù)傳和并發(fā)是現(xiàn)在很多ftp程序都支持的功能,如果我們用python如何來做斷點續(xù)傳和并發(fā)了,今天來看一篇python實現(xiàn)斷點續(xù)傳和并發(fā)的ftp程序例子吧,具體如下。2016-09-09python 執(zhí)行shell命令并將結(jié)果保存的實例
今天小編就為大家分享一篇python 執(zhí)行shell命令并將結(jié)果保存的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-05-05Python學(xué)習(xí)筆記之自定義函數(shù)用法詳解
這篇文章主要介紹了Python學(xué)習(xí)筆記之自定義函數(shù)用法,結(jié)合實例形式詳細(xì)分析了自定義函數(shù)的功能、定義、使用方法及相關(guān)操作注意事項,需要的朋友可以參考下2019-06-06