文章目錄
- 摘要
- yield和return
- 生成器
- 迭代器
- 聯系
摘要
yield和return有什么區別?什么事生成器?什么又是迭代器?他們都有什么作用?簡單理解的話yield=return,回傳函式體處理結果的!yield本身是一個生成器,所以使用return回傳的是我們常見的一些object(eg:list、dict、等),使用yield回傳的是一個迭代器物件!
yield和return
之前一篇文章【開啟Scrapy爬蟲之路】中,處理item時,定義函式回傳值用的yield,有人問yield是干嘛的,什么意思?
相同點: 都是定義函式程序中回傳值
不同點:
- yield是暫停函式,return是結束函式; 即yield回傳值后繼續執行函式體內代碼,return回傳值后不再執行函式體內代碼
- yield回傳的是一個迭代器(yield本身是生成器-生成器是用來生成迭代器的);return回傳的是正常可迭代物件(list,set,dict等具有實際記憶體地址的存盤物件)
# debug測驗
def f1():
print("第1次暫停")
yield '第1次訪問回傳的結果'# yield 暫停函式的呼叫,回傳一個結果
print("第2次暫停")
yield '第2次訪問回傳的結果'
return 100 # reutrun結束函式的呼叫
print('return直接結束,此句不執行')
生成器
如果串列元素可以按照某種演算法推算出來,那我們是否可以在回圈的程序中不斷推算出后續的元素呢?這樣就不必創建完整的list,從而節省大量的空間,在Python中,這種一邊回圈一邊計算的機制,稱為生成器:generator,
要創建一個generator,有很多種方法,第一種方法很簡單,只要把一個串列生成式的[]改成(),就創建了一個generator:
>>> L = [x * x for x in range(10)]
>>> L
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> g = (x * x for x in range(10))
>>> g
<generator object <genexpr> at 0x1022ef630>

yield 回傳的是一個生成器(看成迭代器更好理解)

迭代器
可以直接作用于for回圈的物件統稱為可迭代物件:Iterable
-
一類是集合資料型別,如list、tuple、dict、set、str等;
-
一類是generator,包括生成器和帶yield的generator function

迭代器物件從集合的第一個元素開始訪問,直到所有的元素被訪問完結束,迭代器只能往前不會后退,
迭代器有兩個基本的方法:創建迭代器iter() 和 訪問迭代器next(),
聯系
yield 是一個生成器函式,回傳的是一個迭代器(有說法是回傳的是生成器,我感覺說成迭代器更適合),
最近思維混亂,然后寫了好幾篇博客但是感覺都不太好!都變成草稿了,這一篇本來也想存為草稿的,奈何我還是想在“GEEK+”原創·博主大賽掙扎下,所以發出來拉個票,后續那天清醒了再過來修改完善下,麻煩文末投票鏈接幫忙助力一下
原創不易,謝謝大家支持
再這里列了一些資料,有需要可以自己先研究下!!
【Python3 迭代器與生成器】
【迭代器-百度百科】
【python中yield的用法詳解——最簡單,最清晰的解釋】
【生成器——廖雪峰】
【迭代器——廖雪峰】
寫在最后的拉票環節
最近參加了CSDN官方組織的“GEEK+”原創·博主大賽
歷經重重篩選,終于上榜TOP 50
原創不易,幫忙投個免費的票
支持一下:點擊投票
謝謝大家!!!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/128532.html
標籤:其他
