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

Python3?中return和yield的區(qū)別

 更新時間:2022年06月07日 15:35:17   作者:小小程序員ol  
這篇文章主要介紹了Python3?中return和yield的區(qū)別,return和yield都用來返回值;在一次性地返回所有值場景中return和yield的作用是一樣的,但是具體有什么區(qū)別呢,帶著疑問一起進(jìn)入下面文章學(xué)習(xí)詳細(xì)內(nèi)容吧

一、前言

return一直中,每中語言中其沒沒有很大差別,就不多說了。(shell語言return的是退出狀態(tài),可能差別是比較大的)最早看到y(tǒng)ield應(yīng)該是哪們語言用來調(diào)整什么線程優(yōu)先級的,記不清了,不過那里的yield和python中的yield應(yīng)該功能有區(qū)別。

python中最早看到y(tǒng)ield應(yīng)該是使用scrapy框架寫爬蟲的時候,之前也有去看yiled的用法,總記不太住。今天又去看了一下,基本上來就是講些斐波那契數(shù)列的煩的要死,自己寫段程序研究了一下,這里記一下。

二、return和yield的異同

共同點:return和yield都用來返回值;在一次性地返回所有值場景中return和yield的作用是一樣的。

不同點:如果要返回的數(shù)據(jù)是通過for等循環(huán)生成的迭代器類型數(shù)據(jù)(如列表、元組),return只能在循環(huán)外部一次性地返回,yeild則可以在循環(huán)內(nèi)部逐個元素返回。下邊我們舉例說明這個不同點。

三、實例說明

1 return版本

示例代碼如下:

class TestYield:
    def gen_iterator(self):
        result_list = []
        for j in range(3):
            print(f"gen_iterator-{j}")
            result_list.append(j)
        # return在循環(huán)的外部,待變量完全生成后一次性返回
        return result_list

    def call_gen_iterator(self):
        # 執(zhí)行下邊這句后result_list直接是完成的結(jié)果[0,1,2]
        result_list = self.gen_iterator()
        for i in result_list:
            print(f"call_gen_iterator-{i}")

if __name__ == "__main__":
    obj = TestYield()
    obj.call_gen_iterator()

執(zhí)行結(jié)果如下,可以看到一次性執(zhí)行完下層函數(shù),生成完整的迭代器類型返回值result_list,一次性返回給上層函數(shù):

2 yield版本

示例代碼如下:

class TestYield:
    def gen_iterator(self):
        for j in range(3):
            print(f"do_something-{j}")
            # yield在for循環(huán)內(nèi)部
            yield j

    def call_gen_iterator(self):
        # yield并不是直接返回[0,1,2],執(zhí)行下邊這句后result_list什么值都沒有
        result_list = self.gen_iterator()
        # i每請求一個數(shù)據(jù),才會觸發(fā)gen_iterator生成一個數(shù)據(jù)
        for i in result_list:
            print(f"call_gen_iterator-{i}")

if __name__ == "__main__":
    obj = TestYield()
    obj.call_gen_iterator()

執(zhí)行結(jié)果如下,可以看到上下層函數(shù)是交替進(jìn)行的,即上層函數(shù)請求迭代一個值下層函數(shù)才生成一個值并立即返回這個值:

3 yield的意義

從上邊兩個小節(jié)可以看到,雖然return和yield兩者執(zhí)行的順序有區(qū)別,但整個要做的事情是一樣的,所以使用yield并不會比return快,甚至我們可以猜測由于yield總發(fā)生上下文切換在速度上還會慢一些,所以速度不是yield的意義。

他們的主要區(qū)別是yiled要迭代到哪個元素那個元素才即時地生成,而return要用一個中間變量result_list保存返回值,當(dāng)result_list的長度很長且每個組成元素內(nèi)容很大時將會耗費比較大的內(nèi)存,此時yield相對return才有優(yōu)勢。

四、yield和return嵌套使用

class TestYield:
    def gen_iterator(self):
        for j in range(3):
            print(f"do_something-{j}")
            # yield在for循環(huán)內(nèi)部
            yield j

    def gen_iterator_middle(self):
        print(f"gen_iterator_middle")
        # 返回的是迭代器的句柄,所以加一層return不影響是可以理解的
        return self.gen_iterator()

    def call_gen_iterator(self):
        # yield并不是直接返回[0,1,2],執(zhí)行下邊這句后result_list什么值都沒有
        result_list = self.gen_iterator_middle()
        # i每請求一個數(shù)據(jù),才會觸發(fā)gen_iterator生成一個數(shù)據(jù)
        for i in result_list:
            print(f"call_gen_iterator-{i}")

if __name__ == "__main__":
    obj = TestYield()
    obj.call_gen_iterator()

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

相關(guān)文章

  • python實現(xiàn)AES算法及AES-CFB8加解密源碼

    python實現(xiàn)AES算法及AES-CFB8加解密源碼

    這篇文章主要為大家介紹了python實現(xiàn)AES算法及AES-CFB8加解密的源碼示例,有需要朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2022-02-02
  • python3實現(xiàn)字符串操作的實例代碼

    python3實現(xiàn)字符串操作的實例代碼

    這篇文章主要介紹了python3實現(xiàn)字符串操作的實例代碼,需要的朋友可以參考下
    2019-04-04
  • 解決項目pycharm能運行,在終端卻無法運行的問題

    解決項目pycharm能運行,在終端卻無法運行的問題

    今天小編就為大家分享一篇解決項目pycharm能運行,在終端卻無法運行的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • python的描述符(descriptor)、裝飾器(property)造成的一個無限遞歸問題分享

    python的描述符(descriptor)、裝飾器(property)造成的一個無限遞歸問題分享

    這篇文章主要介紹了python的描述符(descriptor)、裝飾器(property)造成的一個無限遞歸問題分享,一個不太會遇到的問題,需要的朋友可以參考下
    2014-07-07
  • 通俗講解python 裝飾器

    通俗講解python 裝飾器

    這篇文章主要介紹了python 裝飾器的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)python裝飾器的相關(guān)知識,感興趣的朋友可以了解下
    2020-09-09
  • numpy.ndarray 實現(xiàn)對特定行或列取值

    numpy.ndarray 實現(xiàn)對特定行或列取值

    今天小編就為大家分享一篇numpy.ndarray 實現(xiàn)對特定行或列取值,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • python 裝飾器詳解與應(yīng)用范例

    python 裝飾器詳解與應(yīng)用范例

    裝飾器是 Python 的一個重要部分。簡單地說:他們是修改其他函數(shù)的功能的函數(shù)。他們有助于讓我們的代碼更簡短,也更Pythonic。大多數(shù)初學(xué)者不知道在哪兒使用它們,所以我將要分享下,哪些區(qū)域里裝飾器可以讓你的代碼更簡潔。 首先,讓我們討論下如何寫你自己的裝飾器
    2021-11-11
  • 基于Python制作flappybird游戲的詳細(xì)步驟

    基于Python制作flappybird游戲的詳細(xì)步驟

    python中pygame模塊能讓我們很方便的編寫游戲,下面這篇文章主要給大家介紹了關(guān)于如何基于Python制作flappybird游戲的詳細(xì)步驟,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-05-05
  • python如何實現(xiàn)Dice系數(shù)

    python如何實現(xiàn)Dice系數(shù)

    這篇文章主要介紹了python如何實現(xiàn)Dice系數(shù),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • python基于pexpect庫自動獲取日志信息

    python基于pexpect庫自動獲取日志信息

    這篇文章主要介紹了python基于pexpect庫自動獲取日志信息的方法,幫助大家更好的利用python高效辦公,感興趣的朋友可以了解下
    2021-02-02

最新評論

石柱| 乌鲁木齐市| 永靖县| 娄烦县| 常山县| 云林县| 汉寿县| 普安县| 洮南市| 邢台市| 宝鸡市| 多伦县| 鄱阳县| 隆回县| 汉源县| 芒康县| 酒泉市| 无极县| 广平县| 潼关县| 灵武市| 赤城县| 洮南市| 阿拉尔市| 西丰县| 昌图县| 瓮安县| 蒲城县| 建瓯市| 洮南市| 宁南县| 阳朔县| 贵溪市| 怀仁县| 云南省| 容城县| 卢湾区| 深水埗区| 青田县| 临武县| 光泽县|