網(wǎng)站首頁 編程語言 正文
一、前言
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ù)是交替進行的,即上層函數(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()
原文鏈接:https://www.cnblogs.com/python960410445/p/16348590.html
相關(guān)推薦
- 2022-07-06 Python列表創(chuàng)建與銷毀及緩存池機制_python
- 2022-04-07 你知道怎么在?HTML?頁面中使用?React嗎_React
- 2022-03-15 spark-submit hive SQL standards based authorizati
- 2022-07-08 Python實現(xiàn)超快窗口截圖功能詳解_python
- 2022-04-12 用python繪制極坐標(biāo)雷達圖_python
- 2021-12-15 Linux下Makefile的編寫與使用詳解_Linux
- 2023-08-13 為什么Git需要配置ssh密鑰,怎么配置?
- 2022-06-22 C語言詳解判斷相同樹案例分析_C 語言
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支