最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python中的yield全方位解讀

 更新時間:2023年08月21日 09:42:46   作者:軟件測試技術(shù)  
這篇文章主要介紹了Python中的yield全方位解讀,在 Python 中,使用了 yield 的函數(shù)被稱為生成器,跟普通函數(shù)不同的是,生成器是一個返回迭代器的函數(shù),只能用于迭代操作,更簡單點理解生成器就是一個迭代器,需要的朋友可以參考下

Python中的yield

關(guān)于 yield 看了忘,忘了看,零零散散的總是理解不透徹。今天徹底記錄下,帶大家一探 yield 到底是什么?

關(guān)于生成器概念的解釋,摘自菜鳥教程解釋:

在 Python 中,使用了 yield 的函數(shù)被稱為生成器(generator)。 跟普通函數(shù)不同的是,生成器是一個返回迭代器的函數(shù),只能用于迭代操作,更簡單點理解生成器就是一個迭代器。 在調(diào)用生成器運行的過程中,每次遇到 yield 時函數(shù)會暫停并保存當(dāng)前所有的運行信息,返回 yield 的值, 并在下一次執(zhí)行 next() 方法時從當(dāng)前位置繼續(xù)運行。 調(diào)用一個生成器函數(shù),返回的是一個迭代器對象。

網(wǎng)上例子很多,所有例子一開始就是這樣的代碼:

# !?。∵@種代碼 建議別看,因為以我親身經(jīng)歷,初次理解生成器,看這樣的代碼根本看不懂的~
def evenNumber(max):
    n = 0
    while n < max:
        yield n
        n += 2
for i in evenNumber(10):
    print(i)

一會兒我把上述代碼重新寫下。

在此之前,大家還是需要掌握什么是generator(生成器)。

generator(生成器)

最簡單的創(chuàng)建一個生成器的方式,只要把一個列表生成式的 [] 改成 () ,就創(chuàng)建了一個generator:

List  = [i*2 for i in range(10)]
print(List)
#[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
g = (x*2 for x in range(10))
print(g)
#<generator object <genexpr> at 0x000001CBA42F3C10>

生成器(generator)能夠迭代的關(guān)鍵是它有一個next()方法,工作原理就是通過重復(fù)調(diào)用next()方法,直到捕獲一個異常。試一下:

g = (x*2 for x in range(10))
print(g.__next__())
# 0
print(g.__next__())
# 2
print(g.__next__())
# 4
#... ...

第二種方法就是, 如果一個函數(shù)中包含 yield 關(guān)鍵字,那么這個函數(shù)就不再是一個普通函數(shù),而是一個generator。調(diào)用函數(shù)就是創(chuàng)建了一個生成器(generator)對象。

著重講一下第二種方法,先看代碼,為了便于理解,我不寫循環(huán),寫一個生成器函數(shù):

def gen_example():
    print ('第1次執(zhí)行啦~,還沒到第一個yield!')
    yield '我是第1個遇見的yield,你遇到我就要返回'
    print ('第2次執(zhí)行啦~,還沒到第二個yield')
    yield '我是第2個遇見的yield,你遇到我就要返回'
    print ('第3次執(zhí)行啦,我運行完 函數(shù)就執(zhí)行完畢啦~')
for i in gen_example():
    print(i)
    print("--------分割線--------")

執(zhí)行結(jié)果:

第1次執(zhí)行啦~,還沒到第一個yield!
我是第1個遇見的yield,你遇到我就要返回
--------分割線--------
第2次執(zhí)行啦~,還沒到第二個yield
我是第2個遇見的yield,你遇到我就要返回
--------分割線--------
第3次執(zhí)行啦,我運行完 函數(shù)就執(zhí)行完畢啦~

過程詳解:

第一次for 循環(huán)執(zhí)行到y(tǒng)ield結(jié)束 ,只執(zhí)行了這兩句代碼:

在這里插入圖片描述

第二次循環(huán) 是從上一次的yield結(jié)束地方開始執(zhí)行, 到下一個yield結(jié)束(一定要多讀幾遍理解哦):

在這里插入圖片描述

第三次循環(huán)是,從第二次遇見的yield結(jié)束地方開始執(zhí)行,一直到下一個yield結(jié)束(沒有yield,自動執(zhí)行結(jié)束)

在這里插入圖片描述

通過上述規(guī)律我們不難發(fā)現(xiàn),yield相當(dāng)于 return 返回一個值,并且記住這個返回的位置,下次迭代時,代碼從yield的下一條語句開始執(zhí)行!

為了驗證這個規(guī)律 我把本文開頭的代碼 重新寫下,用更容易懂的方式:

def evenNumber(max):
    n = 0
    while n < max:
        yield n
        print("第二次是從這里開始的")
        n += 2
        print(f"n在第二次是{n}")
for i in evenNumber(2):
    print(i)
    print("--------分割線--------")

執(zhí)行結(jié)果:

0
--------分割線--------
第二次是從這里開始的
n在第二次是2

輸出:0, 是怎么得到的呢?函數(shù)第一次執(zhí)行,遇到y(tǒng)ield 就返回,所以此時就打印0。

在這里插入圖片描述

第二次是從這里開始的,n在第二次是2 這又是怎么得到的呢?執(zhí)行yield后面的這部分,然后又進入循環(huán),while循環(huán)條件都不滿足,執(zhí)行結(jié)束。

實際第二次沒有返回值。如果你細心點就會發(fā)現(xiàn),第二次輸出都沒有分割線的內(nèi)容:

在這里插入圖片描述

在這里插入圖片描述

既然 第二次打印都終止了,為什么沒報錯? 好問題!因為調(diào)用next()來執(zhí)行生成器則會報錯,如果使用for循環(huán)遍歷,for循環(huán)會自動捕獲該異常,直接停止遍歷。

def evenNumber(max):
    n = 0
    while n < max:
        yield n
        print("第二次是從這里開始的")
        n += 2
        print(f"n在第二次是{n}")
g = evenNumber(2)
print(g.__next__())
print(g.__next__())

執(zhí)行結(jié)果,調(diào)用next方法就會報錯:

0
第二次是從這里開始的
n在第二次是2
Traceback (most recent call last):
  File "test.py", line 17, in <module>
    print(g.__next__())
StopIteration
***Repl Closed***

所以,就印證了我們的結(jié)論~! 現(xiàn)在來看一些簡單的生成器函數(shù)的例子,是不是就一下懂了。

如果看到這里還是沒懂 ,留言吧,我會好好反思我自;

留個小作業(yè) 大家可以試試分析下斐波那契數(shù)列的過程。

def fab(max): 
    n, a, b = 0, 0, 1 
    while n < max: 
        yield b     
        a, b = b, a + b 
        n = n + 1
for n in fab(5): 
    print n

其它補充

如何判斷是不是 生成器函數(shù)?

使用 isgeneratorfunction 判斷函數(shù)是否是 generator 函數(shù)

from inspect import isgeneratorfunction 
print(isgeneratorfunction(fab) )
#True

為什么生成器函數(shù)中的return 不能返回值?

先看代碼:

def evenNumber(max):
    n = 0
    while n < max:
        yield n
        print("第二次是從這里開始的")
        n += 2
        print(f"n在第二次是{n}")
        return 10
for i in evenNumber(10):
    print(i)
    print("--------分割線--------")

執(zhí)行結(jié)果:

0
--------分割線--------
第二次是從這里開始的
n在第二次是2
***Repl Closed***

為什么 我的return 的值 沒有在最后一次打印出來呢? 在官方文檔中是這樣解釋的:

在這里插入圖片描述

python生成器函數(shù)中return 的作用就是終止生成器。

表示生成器運行完成了,可以結(jié)束了。然后生成器會拋出一個StopIteration的異常。

而for循環(huán)能夠檢測到這個異常,于是結(jié)束循環(huán),也不報錯。但是__next__()就會報錯哦~

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

相關(guān)文章

  • Python字典一個key對應(yīng)多個value幾種實現(xiàn)方式

    Python字典一個key對應(yīng)多個value幾種實現(xiàn)方式

    python中字典的健和值是一一對應(yīng)的,如果對字典進行添加操作時如果健的名字相同,則當(dāng)前健對應(yīng)的值就會被覆蓋,有時候我們想要一個健對應(yīng)多個值的場景,這篇文章主要給大家介紹了關(guān)于Python字典一個key對應(yīng)多個value幾種實現(xiàn)方式的相關(guān)資料,需要的朋友可以參考下
    2023-10-10
  • Python可視化Matplotlib介紹和簡單圖形的繪制

    Python可視化Matplotlib介紹和簡單圖形的繪制

    這篇文章主要介紹了Python可視化Matplotlib介紹和簡單圖形的繪制,文中附含詳細示例代碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-09-09
  • python實現(xiàn)將range()函數(shù)生成的數(shù)字存儲在一個列表中

    python實現(xiàn)將range()函數(shù)生成的數(shù)字存儲在一個列表中

    這篇文章主要介紹了python實現(xiàn)將range()函數(shù)生成的數(shù)字存儲在一個列表中,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04
  • 對python 多線程中的守護線程與join的用法詳解

    對python 多線程中的守護線程與join的用法詳解

    今天小編就為大家分享一篇對python 多線程中的守護線程與join的用法詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-02-02
  • 使用python構(gòu)建一個自己的聊天室

    使用python構(gòu)建一個自己的聊天室

    這篇文章主要介紹了使用python構(gòu)建一個自己的聊天室,有助于幫助小伙伴們理解掌握Python的socket編程,需要的朋友可以參考下
    2023-04-04
  • 詳解tensorflow2.x版本無法調(diào)用gpu的一種解決方法

    詳解tensorflow2.x版本無法調(diào)用gpu的一種解決方法

    這篇文章主要介紹了詳解tensorflow2.x版本無法調(diào)用gpu的一種解決方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • Python實現(xiàn)在PowerPoint中添加和定制形狀

    Python實現(xiàn)在PowerPoint中添加和定制形狀

    在現(xiàn)代辦公自動化場景中, programmatically 生成和編輯 PowerPoint 演示文稿已成為一項常見需求,本文將深入探討如何使用 Python 在 PowerPoint 幻燈片中添加各種形狀,并對其進行樣式定制和效果設(shè)置,感興趣的小伙伴可以了解下
    2026-03-03
  • python 如何把classification_report輸出到csv文件

    python 如何把classification_report輸出到csv文件

    這篇文章主要介紹了python 把classification_report輸出到csv文件的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-05-05
  • Python 實現(xiàn)簡單的電話本功能

    Python 實現(xiàn)簡單的電話本功能

    這篇文章主要介紹了Python 實現(xiàn)簡單的電話本功能的相關(guān)資料,包括添加聯(lián)系人信息,查找姓名顯示聯(lián)系人,存儲聯(lián)系人到 TXT 文檔等內(nèi)容,十分的細致,有需要的小伙伴可以參考下
    2015-08-08
  • python?kornia計算機視覺庫實現(xiàn)圖像變化

    python?kornia計算機視覺庫實現(xiàn)圖像變化

    這篇文章主要為大家介紹了python?kornia計算機視覺庫實現(xiàn)圖像變化算法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2024-01-01

最新評論

灵寿县| 白河县| 哈尔滨市| 财经| 枞阳县| 辽中县| 阿拉善盟| 盐山县| 南华县| 祁阳县| 紫阳县| 固安县| 郁南县| 天峻县| 孟津县| 高邮市| 盐亭县| 阳高县| 大邑县| 靖边县| 迁安市| 右玉县| 双辽市| 荣成市| 固镇县| 当雄县| 祁连县| 当涂县| 榆树市| SHOW| 平陆县| 杭锦旗| 基隆市| 集贤县| 浑源县| 鄯善县| 安塞县| 徐闻县| 鲁甸县| 新余市| 祁连县|