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

python 如何區(qū)分return和yield

 更新時(shí)間:2020年09月22日 12:05:20   作者:諸子流  
這篇文章主要介紹了python 如何區(qū)分return和yield,幫助大家更好的理解和使用python,感興趣的朋友可以了解下

一、說(shuō)明

return一直中,每中語(yǔ)言中其沒沒有很大差別,就不多說(shuō)了。(shell語(yǔ)言return的是退出狀態(tài),可能差別是比較大的,感興趣可參見“Linux Shell函數(shù)定義與調(diào)用”)

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

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

二、return和yield的異同

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

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

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

3.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ù):

3.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每請(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.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什么值都沒有
  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()

以上就是python 如何區(qū)分return和yield的詳細(xì)內(nèi)容,更多關(guān)于python return和yield的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 分享10個(gè)有趣的Python程序

    分享10個(gè)有趣的Python程序

    這篇文章主要給大家分享的是10個(gè)有趣的Python程序,Python程序有許多模塊和第三方包,這非常有助于高效編程,所以了解這些模塊的正確使用方法是很重要的,下面詳細(xì)內(nèi)容,需要的小伙伴可以參考一下
    2022-02-02
  • 解決Python安裝時(shí)報(bào)缺少DLL問題【兩種解決方法】

    解決Python安裝時(shí)報(bào)缺少DLL問題【兩種解決方法】

    這篇文章主要介紹了解決Python安裝時(shí)報(bào)缺少DLL問題,本文通過(guò)兩種方法給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下
    2019-07-07
  • python?序列去重并保持原始順序操作

    python?序列去重并保持原始順序操作

    這篇文章主要介紹了python序列去重并保持原始順序操作,文章圍繞了python?序列去重的相關(guān)資料展開詳細(xì)介紹,需要的小伙伴可以參考一下,希望對(duì)你的有所幫助
    2022-03-03
  • 淺談python的dataframe與series的創(chuàng)建方法

    淺談python的dataframe與series的創(chuàng)建方法

    今天小編就為大家分享一篇淺談python的dataframe與series的創(chuàng)建方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-11-11
  • 如何用Python繪制簡(jiǎn)易動(dòng)態(tài)圣誕樹

    如何用Python繪制簡(jiǎn)易動(dòng)態(tài)圣誕樹

    這篇文章主要給大家介紹了關(guān)于如何用Python繪制簡(jiǎn)易動(dòng)態(tài)圣誕樹,文中講解了如何通過(guò)編寫代碼來(lái)實(shí)現(xiàn)特定的效果,包括代碼的編寫技巧和效果的展示,需要的朋友可以參考下
    2025-01-01
  • 淺析Python中else語(yǔ)句塊的使用技巧

    淺析Python中else語(yǔ)句塊的使用技巧

    這篇文章主要介紹了淺析Python中else語(yǔ)句塊的使用技巧的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-06-06
  • python3字符串輸出常見面試題總結(jié)

    python3字符串輸出常見面試題總結(jié)

    在本篇文章里小編給大家整理的是一篇關(guān)于python3字符串輸出常見面試題總結(jié)內(nèi)容,有需要的朋友們可以參考下。
    2020-12-12
  • linux環(huán)境下Django的安裝配置詳解

    linux環(huán)境下Django的安裝配置詳解

    這篇文章主要介紹了linux環(huán)境下Django的安裝配置詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07
  • python pip安裝包出現(xiàn):Failed building wheel for xxx錯(cuò)誤的解決

    python pip安裝包出現(xiàn):Failed building wheel for xxx錯(cuò)誤的解決

    今天小編就為大家分享一篇python pip安裝包出現(xiàn):Failed building wheel for xxx錯(cuò)誤的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-12-12
  • python數(shù)組循環(huán)處理方法

    python數(shù)組循環(huán)處理方法

    今天小編就為大家分享一篇python數(shù)組循環(huán)處理方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-08-08

最新評(píng)論

信宜市| 仁布县| 河西区| 高淳县| 华容县| 珠海市| 乌兰县| 南漳县| 儋州市| 凤台县| 常宁市| 衢州市| 浦江县| 青阳县| 偃师市| 常山县| 静海县| 崇州市| 昆山市| 江孜县| 六安市| 乌拉特中旗| 应城市| 永清县| 澄江县| 蚌埠市| 襄垣县| 菏泽市| 永德县| 乡宁县| 连城县| 行唐县| 宣城市| 黄冈市| 资源县| 水城县| 永济市| 海盐县| 高州市| 镇坪县| 右玉县|