亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

yield-Python大牛必須掌握的高端語法

系統 1868 0

小白:大牛哥,剛才看到有一個函數不使用 return 返回結果,而是使用 yield 關鍵字返回結果 , 看不太明白, Python yield 關鍵字的用途是什么 , 它有什么作用

?

大牛 : 要想理解 yield 的作用,你必須了解什么是生成器 (generators) 了解生成器之前(generators)你需要先去了解什么是 可迭代對象 (iterables)

?

大牛:小白啊,今天你大牛哥我剛好有空,給你說道說道這個 yield 的作用。讓你開開眼界,看看我大牛都是怎么寫出牛逼代碼的。

?

小白:好呀好呀!!!

?

大牛:我們先來看看什么是 可迭代對象 (iterables)

?

當你創建了一個列表,你可以遍歷這個列表讀取它的每一個元素,逐個讀取列表元素 的過程 稱為迭代 (iteration)

? yield-Python大牛必須掌握的高端語法_第1張圖片

?

?

上面代碼中 mylist 就是可迭代對象 (iterables), 使用列表推導式生成的對象也是可迭代對象

?

向這種可以使用 for ... in .. 語法去迭代的對象都是可迭代對象。

? yield-Python大牛必須掌握的高端語法_第2張圖片

?

?

大牛:小白,明白什么是可迭代對象了嗎?你來說一說 Python 里面有那些常見的可迭代對象。

?

小白:明白了。可以使用 for...in... 獲取里面元素的對象就是可迭代對象,像字典,列表,元組,字符串都是可迭代對象。大牛哥我說的沒錯吧!

大牛:給你 32 個贊!!不錯,一點就通。知道什么是可迭代對象后繼續來看 生成器 (generators)

?

生成器是迭代器 (iterators) ,但是只能迭代一次,生成器不會將所有值存儲在內存中,而是實時的生成這些值:

? yield-Python大牛必須掌握的高端語法_第3張圖片

?

?

將列推導式的 [] 改成了 () 其他并沒有做任何改變,但是 mygenerators 已經不是列表,而是生成器。生成器迭代一次之后就不能再次迭代。 計算出 0 ,然后并不保存結果和狀態繼續計算出 1 ,最后計算出 4 ,逐一生成。

?

這只是創建生成器的一種方式,另外一種方式就是我們今天的主角 yield 關鍵字。

?

? yield-Python大牛必須掌握的高端語法_第4張圖片

?

?

?

yield 是一個類似 return 的關鍵字。 當我們調用這個函數的時候并不是返回計算的結果,而是返回一個生成器。只有迭代這個生成器的時候才會計算結果。

?

for i in mygenerator: 第一次循環的時候函數執行到 yield 關鍵字位置,返回 i*i 的值,然后將函數掛起 ( 保存函數執行的狀態 ) for i in mygenerator: 第二次循環的繼續執行剛才的函數 ( 掛起的位置 ) ,也就是執行生成器里面的 for 循環,返回 i*i 的值,然后再次將函數掛起。直到生成器里沒有值可以返回就結束。

?

yield 可以返回值,但是不會結束函數的執行,如果函數后面還有代碼,同樣是可以執行的。

?

? yield-Python大牛必須掌握的高端語法_第5張圖片

?

?

上面的函數其實沒有什么作用,只是用來演示生成器用法。生成器在那些地方會用到呢?

比如需要創建一個非常大的列表直接使用列表推導式可能會導致內存被耗盡,這代碼是創建不了列表,電腦內存不足以保存這個列表。

?

?

?

?

但是用生成器可以創建成功,需要使用的時候再從生成器中取出。

?

?

?

?

?

對比下面這兩段代碼:求 1-10 的偶數

大部分人的寫法是這樣的

? yield-Python大牛必須掌握的高端語法_第6張圖片

?

?

大牛的寫法是這樣子的

?

? yield-Python大牛必須掌握的高端語法_第7張圖片

?

?

同樣的功能,但是用生成器要簡便很多。

?

yield? 好處:

?

1.不會將所有數據取出來存入內存中;而是返回了一個對象;可以通過對象獲取數據;用多少取多少,可以節省內 空間。

2.除了能返回一個值,還不會終止循環的運行

?

大牛:咳咳!一口氣講了這么多,差點就要把大牛我累掛了。小白同學,聽明白了嗎?

?

小白:哦,原來 yield 是這么個用法。謝謝大牛哥!經大牛哥這么一說,我發現以前我寫的代碼很多都可以用 yield 寫成生成器啊!就拿你上面求偶數例子吧,采用 yield 的寫法效率是否比普通寫法高呢?

?

大牛:效率肯定比較高的,看下面的對比

?

def test ():
???? for i in range ( 1 , 11000000 ):
???????? if i % 2 == 0 :
???????????? yield i
def test1 ():
????result = []
???? for i in range ( 1 , 11000000 ):
???????? if i % 2 == 0 :
????????????result.append(i)
???? return result

?

?

?

0.8925411701202393???# 生成器寫法耗時

1.1444191932678223???# 普通寫法耗時

?

小白:哇!老板就經常嫌棄我寫的代碼執行效率低,每次我都是拿 Python 本身執行效率就比較低的理由去搪塞老板,原來還可以在這些細節上做優化的。

?

小白:聽大牛哥一席話,勝讀一本 Python 核心編程。老板叫我回去改 BUG emememem

?

大牛:坐看庭前花開花落,笑看天邊云卷云舒。泡一杯咖啡,坐等下班。

?

產品經理:大牛,你寫的代碼又出 BUG 了,還不趕緊回來看看。你是不想下班了吧!

?

大牛:哎,來了,來了。

?


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

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

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 欧美日韩亚洲国产无线码 | 国产成人精品免费视频大 | 欧美色久 | 夜夜骑加勒比 | 久久婷婷色一区二区三区 | 亚洲最大激情中文字幕 | 欧美一区二区三区高清视频 | 99久久精品国产综合一区 | 综合亚洲精品一区二区三区 | 国产精品你懂的 | 欧美午夜性春 | 国产一级淫片a | 99国产精品高清一区二区二区 | 日韩城人视频 | 国产精品国产亚洲精品不卡 | 欧美在线色视频 | 亚洲精品日本高清中文字幕 | 最近更新在线中文字幕一页 | 日韩不卡在线观看 | 天天色天天草 | 天天爽夜夜爽精品视频一 | 成人欧美在线观看免费视频 | 国产一级理论免费版 | 御姐色网 | julia中文字幕久久亚洲 | 97在线观看播放 | 九九九九在线精品免费视频 | 久久99综合国产精品亚洲首页 | 婷婷综合视频 | 69成人做爰视频在线观看 | 国产精品视频99 | 国产精品久久网 | 亚洲 欧美 另类 天天更新影院 | 亚洲欧美久久一区二区 | 欧美中文字幕一二三四区 | 一区二区视频在线观看免费的 | 狠狠色成人综合 | 美国一级毛片片免费 | 亚洲欧美日韩综合 | 亚洲精品一区二区三区婷婷月 | 国内精品视频成人一区二区 |