激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - python 如何區分return和yield

python 如何區分return和yield

2020-09-23 00:07諸子流 Python

這篇文章主要介紹了python 如何區分return和yield,幫助大家更好的理解和使用python,感興趣的朋友可以了解下

一、說明

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

最早看到yield應該是哪們語言用來調整什么線程優先級的,記不清了,不過那里的yield和python中的yield應該功能有區別。

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

二、return和yield的異同

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

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

三、實例說明

3.1 return版本

示例代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class TestYield:
 def gen_iterator(self):
  result_list = []
  for j in range(3):
   print(f"gen_iterator-{j}")
   result_list.append(j)
  # return在循環的外部,待變量完全生成后一次性返回
  return result_list
 
 def call_gen_iterator(self):
  # 執行下邊這句后result_list直接是完成的結果[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()

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

python 如何區分return和yield

3.2 yield版本

示例代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class TestYield:
 def gen_iterator(self):
  for j in range(3):
   print(f"do_something-{j}")
   # yield在for循環內部
   yield j
 
 def call_gen_iterator(self):
  # yield并不是直接返回[0,1,2],執行下邊這句后result_list什么值都沒有
  result_list = self.gen_iterator()
  # i每請求一個數據,才會觸發gen_iterator生成一個數據
  for i in result_list:
   print(f"call_gen_iterator-{i}")
 
if __name__ == "__main__":
 obj = TestYield()
 obj.call_gen_iterator()

執行結果如下,可以看到上下層函數是交替進行的,即上層函數請求迭代一個值下層函數才生成一個值并立即返回這個值:

python 如何區分return和yield

3.3 yield的意義

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

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

四、yield和return嵌套使用

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class TestYield:
 def gen_iterator(self):
  for j in range(3):
   print(f"do_something-{j}")
   # yield在for循環內部
   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],執行下邊這句后result_list什么值都沒有
  result_list = self.gen_iterator_middle()
  # i每請求一個數據,才會觸發gen_iterator生成一個數據
  for i in result_list:
   print(f"call_gen_iterator-{i}")
 
if __name__ == "__main__":
 obj = TestYield()
 obj.call_gen_iterator()

python 如何區分return和yield

以上就是python 如何區分return和yield的詳細內容,更多關于python return和yield的資料請關注服務器之家其它相關文章!

原文鏈接:https://www.cnblogs.com/lsdb/p/12534443.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日韩黄色三级视频 | av在线大全 | 免费黄色a| xnxx 日本19| 一区二区三区欧美在线观看 | 日韩av电影在线免费观看 | 在线观看视频毛片 | 国产精品亚洲一区二区三区久久 | 视频在线中文字幕 | 久久精品成人影院 | 俄罗斯16一20sex牲色另类 | 国产草草视频 | 神马顶级推理片免费看 | 在线中文字幕观看 | 亚洲第一页中文字幕 | 日韩黄色一级视频 | 看免费毛片 | 欧美黄色片免费看 | 欧美性精品videofree | 国产妇女乱码一区二区三区 | 久草在线观看首页 | 露脸各种姿势啪啪的清纯美女 | 免费网站看v片在线a | 国产在线精品一区二区三区 | 日本xxxx色视频在线观看免费, | 日韩黄在线 | 永久免费不卡在线观看黄网站 | 一级网站 | 四季久久免费一区二区三区四区 | 欧美18一19sex性护士农村 | 国产一区二区三区精品在线观看 | 成人男男视频拍拍拍在线观看 | 高清国产午夜精品久久久久久 | 91精品国产刺激国语对白 | 国产一级在线观看视频 | 97超碰资源站 | 欧美a在线播放 | japanese末成年free | 久久国产精品一区 | 啊哈不要啊 | 午夜伦情电午夜伦情电影 |