欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python生成器之yield詳解

 更新時(shí)間:2023年05月21日 08:59:42   作者:程序員喵大人  
這篇文章主要介紹了Python生成器yield,yield除了作為生成器的標(biāo)志以外,還有一個(gè)「返回值」的功能,我們知道return也有這個(gè)功能,那么它跟return的這個(gè)返回值有什么區(qū)別呢,本文將詳細(xì)的介紹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ǔ)句就開(kāi)始執(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í)候是從上次暫停的位置開(kāi)始又繼續(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ǔ)句,那么它就是生成器,即也是迭代器。這種方式比前面寫(xiě)迭代器的類(lèi)要簡(jiǎn)便的多,但這不是說(shuō)迭代器不好,無(wú)論是使用迭代器還是生成器都要具體問(wèn)題具體分析。

到此這篇關(guān)于Python生成器之yield詳解的文章就介紹到這了,更多相關(guān)Python yield內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 深入理解python虛擬機(jī)如何實(shí)現(xiàn)閉包

    深入理解python虛擬機(jī)如何實(shí)現(xiàn)閉包

    當(dāng)能夠從設(shè)計(jì)者的層面去理解閉包就再也不用死記硬背一些閉包的概念了,所以本文就來(lái)從虛擬機(jī)層面和大家一起討論函數(shù)閉包是如何實(shí)現(xiàn)的
    2023-10-10
  • 基于tensorflow for循環(huán) while循環(huán)案例

    基于tensorflow for循環(huán) while循環(huán)案例

    這篇文章主要介紹了基于tensorflow for循環(huán) while循環(huán)案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-06-06
  • Python離線安裝第三方庫(kù)詳細(xì)操作流程

    Python離線安裝第三方庫(kù)詳細(xì)操作流程

    在使用Python開(kāi)發(fā)過(guò)程中,我們經(jīng)常需要使用各種第三方庫(kù)來(lái)擴(kuò)展Python的功能,這篇文章主要給大家介紹了關(guān)于Python離線安裝第三方庫(kù)的相關(guān)資料,需要的朋友可以參考下
    2023-11-11
  • 在PyCharm下打包*.py程序成.exe的方法

    在PyCharm下打包*.py程序成.exe的方法

    今天小編就為大家分享一篇在PyCharm下打包*.py程序成.exe的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-11-11
  • Python中Timedelta轉(zhuǎn)換為Int或Float方式

    Python中Timedelta轉(zhuǎn)換為Int或Float方式

    這篇文章主要介紹了Python中Timedelta轉(zhuǎn)換為Int或Float方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • Python實(shí)現(xiàn)京東秒殺功能代碼

    Python實(shí)現(xiàn)京東秒殺功能代碼

    這篇文章主要介紹了Python實(shí)現(xiàn)京東秒殺功能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • python實(shí)現(xiàn)可以斷點(diǎn)續(xù)傳和并發(fā)的ftp程序

    python實(shí)現(xiàn)可以斷點(diǎn)續(xù)傳和并發(fā)的ftp程序

    斷點(diǎn)續(xù)傳和并發(fā)是現(xiàn)在很多ftp程序都支持的功能,如果我們用python如何來(lái)做斷點(diǎn)續(xù)傳和并發(fā)了,今天來(lái)看一篇python實(shí)現(xiàn)斷點(diǎn)續(xù)傳和并發(fā)的ftp程序例子吧,具體如下。
    2016-09-09
  • python 執(zhí)行shell命令并將結(jié)果保存的實(shí)例

    python 執(zhí)行shell命令并將結(jié)果保存的實(shí)例

    今天小編就為大家分享一篇python 執(zhí)行shell命令并將結(jié)果保存的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • 分享7個(gè) Python 實(shí)戰(zhàn)項(xiàng)目練習(xí)

    分享7個(gè) Python 實(shí)戰(zhàn)項(xiàng)目練習(xí)

    這篇文章主要介紹了分享7個(gè) Python 實(shí)戰(zhàn)項(xiàng)目代碼,經(jīng)過(guò)Python3.6.4調(diào)試通過(guò)的代碼,就具一點(diǎn)的參考價(jià)值,需要的小伙伴可以參考一下
    2022-03-03
  • Python學(xué)習(xí)筆記之自定義函數(shù)用法詳解

    Python學(xué)習(xí)筆記之自定義函數(shù)用法詳解

    這篇文章主要介紹了Python學(xué)習(xí)筆記之自定義函數(shù)用法,結(jié)合實(shí)例形式詳細(xì)分析了自定義函數(shù)的功能、定義、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2019-06-06

最新評(píng)論