小白:大牛哥,剛才看到有一個函數不使用 return 返回結果,而是使用 yield 關鍵字返回結果 , 看不太明白, Python 中 yield 關鍵字的用途是什么 , 它有什么作用 呀 ?
?
大牛 : 要想理解 yield 的作用,你必須了解什么是生成器 (generators) , 了解生成器之前(generators)你需要先去了解什么是 可迭代對象 (iterables) 。
?
大牛:小白啊,今天你大牛哥我剛好有空,給你說道說道這個 yield 的作用。讓你開開眼界,看看我大牛都是怎么寫出牛逼代碼的。
?
小白:好呀好呀!!!
?
大牛:我們先來看看什么是 可迭代對象 (iterables) 。
?
當你創建了一個列表,你可以遍歷這個列表讀取它的每一個元素,逐個讀取列表元素 的過程 稱為迭代 (iteration) 。
?
?
上面代碼中 mylist 就是可迭代對象 (iterables), 使用列表推導式生成的對象也是可迭代對象
?
向這種可以使用 for ... in .. 語法去迭代的對象都是可迭代對象。
?
?
大牛:小白,明白什么是可迭代對象了嗎?你來說一說 Python 里面有那些常見的可迭代對象。
?
小白:明白了。可以使用 for...in... 獲取里面元素的對象就是可迭代對象,像字典,列表,元組,字符串都是可迭代對象。大牛哥我說的沒錯吧!
大牛:給你 32 個贊!!不錯,一點就通。知道什么是可迭代對象后繼續來看 生成器 (generators) 。
?
生成器是迭代器 (iterators) ,但是只能迭代一次,生成器不會將所有值存儲在內存中,而是實時的生成這些值:
?
?
將列推導式的 [] 改成了 () 其他并沒有做任何改變,但是 mygenerators 已經不是列表,而是生成器。生成器迭代一次之后就不能再次迭代。 計算出 0 ,然后并不保存結果和狀態繼續計算出 1 ,最后計算出 4 ,逐一生成。
?
這只是創建生成器的一種方式,另外一種方式就是我們今天的主角 yield 關鍵字。
?
?
?
?
yield 是一個類似 return 的關鍵字。 當我們調用這個函數的時候并不是返回計算的結果,而是返回一個生成器。只有迭代這個生成器的時候才會計算結果。
?
for i in mygenerator: 第一次循環的時候函數執行到 yield 關鍵字位置,返回 i*i 的值,然后將函數掛起 ( 保存函數執行的狀態 ) 。 for i in mygenerator: 第二次循環的繼續執行剛才的函數 ( 掛起的位置 ) ,也就是執行生成器里面的 for 循環,返回 i*i 的值,然后再次將函數掛起。直到生成器里沒有值可以返回就結束。
?
yield 可以返回值,但是不會結束函數的執行,如果函數后面還有代碼,同樣是可以執行的。
?
?
?
上面的函數其實沒有什么作用,只是用來演示生成器用法。生成器在那些地方會用到呢?
比如需要創建一個非常大的列表直接使用列表推導式可能會導致內存被耗盡,這代碼是創建不了列表,電腦內存不足以保存這個列表。
?
?
?
但是用生成器可以創建成功,需要使用的時候再從生成器中取出。
?
?
?
?
對比下面這兩段代碼:求 1-10 的偶數
大部分人的寫法是這樣的
?
?
大牛的寫法是這樣子的
?
?
?
同樣的功能,但是用生成器要簡便很多。
?
yield? 的 好處:
?
1.不會將所有數據取出來存入內存中;而是返回了一個對象;可以通過對象獲取數據;用多少取多少,可以節省內 存 空間。
2.除了能返回一個值,還不會終止循環的運行
?
大牛:咳咳!一口氣講了這么多,差點就要把大牛我累掛了。小白同學,聽明白了嗎?
?
小白:哦,原來 yield 是這么個用法。謝謝大牛哥!經大牛哥這么一說,我發現以前我寫的代碼很多都可以用 yield 寫成生成器啊!就拿你上面求偶數例子吧,采用 yield 的寫法效率是否比普通寫法高呢?
?
大牛:效率肯定比較高的,看下面的對比
?
def
test
():
? |
?
?
0.8925411701202393???# 生成器寫法耗時
1.1444191932678223???# 普通寫法耗時
?
小白:哇!老板就經常嫌棄我寫的代碼執行效率低,每次我都是拿 Python 本身執行效率就比較低的理由去搪塞老板,原來還可以在這些細節上做優化的。
?
小白:聽大牛哥一席話,勝讀一本 Python 核心編程。老板叫我回去改 BUG 了 emememem 。
?
大牛:坐看庭前花開花落,笑看天邊云卷云舒。泡一杯咖啡,坐等下班。
?
產品經理:大牛,你寫的代碼又出 BUG 了,還不趕緊回來看看。你是不想下班了吧!
?
大牛:哎,來了,來了。
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
