真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Python3基礎(chǔ)教程:return和yield的區(qū)別

一、說(shuō)明

return一直中,每中語(yǔ)言中其沒(méi)沒(méi)有很大差別,就不多說(shuō)了。(shell語(yǔ)言return的是退出狀態(tài),可能差別是比較大的)

創(chuàng)新互聯(lián)自2013年創(chuàng)立以來(lái),是專(zhuān)業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元天津做網(wǎng)站,已為上家服務(wù),為天津各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話(huà):13518219792

最早看到y(tǒng)ield應(yīng)該是哪們語(yǔ)言用來(lái)調(diào)整什么線(xiàn)程優(yōu)先級(jí)的,記不清了,不過(guò)那里的yield和python中的yield應(yīng)該功能有區(qū)別。

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

二、return和yield的異同

共同點(diǎn):return和yield都用來(lái)返回值;在一次性地返回所有值場(chǎng)景中return和yield的作用是一樣的。

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

三、實(shí)例說(shuō)明

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ù),生成完整的迭代器類(lèi)型返回值result_list,一次性返回給上層函數(shù):

2 yield版本

示例代碼如下:

'''
學(xué)習(xí)中遇到問(wèn)題沒(méi)人解答?小編創(chuàng)建了一個(gè)Python學(xué)習(xí)交流群:
尋找有志同道合的小伙伴,互幫互助,群里還有不錯(cuò)的視頻學(xué)習(xí)教程和PDF電子書(shū)!
'''

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什么值都沒(méi)有
        result_list = self.gen_iterator()
        # i每請(qǐng)求一個(gè)數(shù)據(jù),才會(huì)觸發(fā)gen_iterator生成一個(gè)數(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ù)請(qǐng)求迭代一個(gè)值下層函數(shù)才生成一個(gè)值并立即返回這個(gè)值:

3 yield的意義

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

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

四、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什么值都沒(méi)有
        result_list = self.gen_iterator_middle()
        # i每請(qǐng)求一個(gè)數(shù)據(jù),才會(huì)觸發(fā)gen_iterator生成一個(gè)數(shù)據(jù)
        for i in result_list:
            print(f"call_gen_iterator-{i}")

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


網(wǎng)站欄目:Python3基礎(chǔ)教程:return和yield的區(qū)別
URL鏈接:http://weahome.cn/article/dsogjii.html

其他資訊

在線(xiàn)咨詢(xún)

微信咨詢(xún)

電話(huà)咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部