日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

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

系統(tǒng) 1753 0

小白:大牛哥,剛才看到有一個(gè)函數(shù)不使用 return 返回結(jié)果,而是使用 yield 關(guān)鍵字返回結(jié)果 , 看不太明白, Python yield 關(guān)鍵字的用途是什么 , 它有什么作用

?

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

?

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

?

小白:好呀好呀!!!

?

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

?

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

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

?

?

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

?

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

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

?

?

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

?

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

大牛:給你 32 個(gè)贊!!不錯(cuò),一點(diǎn)就通。知道什么是可迭代對(duì)象后繼續(xù)來看 生成器 (generators)

?

生成器是迭代器 (iterators) ,但是只能迭代一次,生成器不會(huì)將所有值存儲(chǔ)在內(nèi)存中,而是實(shí)時(shí)的生成這些值:

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

?

?

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

?

這只是創(chuàng)建生成器的一種方式,另外一種方式就是我們今天的主角 yield 關(guān)鍵字。

?

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

?

?

?

yield 是一個(gè)類似 return 的關(guān)鍵字。 當(dāng)我們調(diào)用這個(gè)函數(shù)的時(shí)候并不是返回計(jì)算的結(jié)果,而是返回一個(gè)生成器。只有迭代這個(gè)生成器的時(shí)候才會(huì)計(jì)算結(jié)果。

?

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

?

yield 可以返回值,但是不會(huì)結(jié)束函數(shù)的執(zhí)行,如果函數(shù)后面還有代碼,同樣是可以執(zhí)行的。

?

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

?

?

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

比如需要?jiǎng)?chuàng)建一個(gè)非常大的列表直接使用列表推導(dǎo)式可能會(huì)導(dǎo)致內(nèi)存被耗盡,這代碼是創(chuàng)建不了列表,電腦內(nèi)存不足以保存這個(gè)列表。

?

?

?

?

但是用生成器可以創(chuàng)建成功,需要使用的時(shí)候再從生成器中取出。

?

?

?

?

?

對(duì)比下面這兩段代碼:求 1-10 的偶數(shù)

大部分人的寫法是這樣的

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

?

?

大牛的寫法是這樣子的

?

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

?

?

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

?

yield? 好處:

?

1.不會(huì)將所有數(shù)據(jù)取出來存入內(nèi)存中;而是返回了一個(gè)對(duì)象;可以通過對(duì)象獲取數(shù)據(jù);用多少取多少,可以節(jié)省內(nèi) 空間。

2.除了能返回一個(gè)值,還不會(huì)終止循環(huán)的運(yùn)行

?

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

?

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

?

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

?

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???# 生成器寫法耗時(shí)

1.1444191932678223???# 普通寫法耗時(shí)

?

小白:哇!老板就經(jīng)常嫌棄我寫的代碼執(zhí)行效率低,每次我都是拿 Python 本身執(zhí)行效率就比較低的理由去搪塞老板,原來還可以在這些細(xì)節(jié)上做優(yōu)化的。

?

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

?

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

?

產(chǎn)品經(jīng)理:大牛,你寫的代碼又出 BUG 了,還不趕緊回來看看。你是不想下班了吧!

?

大牛:哎,來了,來了。

?


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

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

【本文對(duì)您有幫助就好】

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

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 聂拉木县| 陆川县| 班玛县| 分宜县| 牟定县| 遵义县| 奉新县| 石棉县| 双峰县| 宾阳县| 万山特区| 武清区| 萨迦县| 卢氏县| 石门县| 都昌县| 罗源县| 黔南| 色达县| 丰顺县| 阿拉善右旗| 巴中市| 韩城市| 永吉县| 华蓥市| 广平县| 林州市| 西城区| 项城市| 东宁县| 宁津县| 师宗县| 静宁县| 抚远县| 井冈山市| 邻水| 齐齐哈尔市| 平阴县| 绍兴县| 清河县| 巍山|