成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Python關(guān)鍵字yield-大牛必須掌握的高端語(yǔ)法

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

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

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

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

小白:好呀好呀!!!

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

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

 

Python關(guān)鍵字yield-大牛必須掌握的高端語(yǔ)法

 

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

 

Python關(guān)鍵字yield-大牛必須掌握的高端語(yǔ)法

 

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

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

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

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

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

 

Python關(guān)鍵字yield-大牛必須掌握的高端語(yǔ)法

 

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

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

 

Python關(guān)鍵字yield-大牛必須掌握的高端語(yǔ)法

 

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í)行到y(tǒng)ield關(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ù)掛起。直到生成器里沒(méi)有值可以返回就結(jié)束。

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

 

Python關(guān)鍵字yield-大牛必須掌握的高端語(yǔ)法

 

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

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

 

Python關(guān)鍵字yield-大牛必須掌握的高端語(yǔ)法

 

但是用生成器可以創(chuàng)建成功,需要使用的時(shí)候再?gòu)纳善髦腥〕觥?/p>

 

Python關(guān)鍵字yield-大牛必須掌握的高端語(yǔ)法

 

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

大部分人的寫法是這樣的

 

Python關(guān)鍵字yield-大牛必須掌握的高端語(yǔ)法

 

大牛的寫法是這樣子的

 

Python關(guān)鍵字yield-大牛必須掌握的高端語(yǔ)法

 

同樣的功能,但是用生成器要簡(jiǎn)便很多。

yield 的好處:

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

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

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

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

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

def test(): for i in range(1, 11000000): if i % 2 == 0: yield idef 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í)行效率就比較低的理由去搪塞老板,原來(lái)還可以在這些細(xì)節(jié)上做優(yōu)化的。

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

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

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

責(zé)任編輯:武曉燕 來(lái)源: 今日頭條
相關(guān)推薦

2013-01-30 10:12:14

Pythonyield

2023-12-11 13:59:00

YieldPython生成器函數(shù)

2009-12-18 11:37:54

Ruby關(guān)鍵字yiel

2023-01-13 08:54:20

MySQL數(shù)據(jù)庫(kù)

2025-01-22 08:06:38

C#yield數(shù)據(jù)迭代

2022-05-06 08:32:40

Pythonwith代碼

2017-06-05 13:56:34

前端開發(fā)JavaScriptthis

2018-04-20 15:56:09

Pythonglobal關(guān)鍵字

2009-08-26 09:58:22

C#關(guān)鍵字

2020-08-23 11:03:24

Python開發(fā)void

2024-03-15 15:12:27

關(guān)鍵字底層代碼

2022-11-12 18:32:50

Golangomitemptyjson

2022-02-17 08:31:38

C語(yǔ)言staic關(guān)鍵字

2021-02-01 13:10:07

Staticc語(yǔ)言UNIX系統(tǒng)

2025-01-09 10:30:40

2009-08-21 14:58:56

C# this關(guān)鍵字

2024-01-07 20:15:49

Python編程語(yǔ)言

2009-09-17 09:30:00

Linq LET關(guān)鍵字

2022-01-04 16:35:42

C++Protected關(guān)鍵字

2012-03-01 12:50:03

Java
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 日本成人一区二区 | 一二三四在线视频观看社区 | 欧美日韩中文在线 | 国产精品美女久久久久aⅴ国产馆 | 99精品视频一区二区三区 | 美女二区| 无吗视频| 国产午夜精品一区二区三区嫩草 | 少妇一区在线观看 | 国产精品久久久久久久午夜 | 久久久91精品国产一区二区精品 | 久久国产精品视频 | 一级免费毛片 | 久久er99热精品一区二区 | 国产中文字幕在线 | www.天天操.com | av在线免费不卡 | 美女天天干天天操 | 国产精品一区久久久 | 亚洲电影一区 | 国产精品日韩在线 | 久久久久久av | 亚洲在线 | 欧美在线资源 | 国产毛片久久久久久久久春天 | 日韩免费| 久久久久免费观看 | 狠狠久久综合 | 国产91在线 | 亚洲 | 91最新视频| 色综合久久久 | 亚洲一区精品在线 | 精品国产一区三区 | 成人在线免费观看视频 | 狠狠色综合欧美激情 | 国产传媒视频在线观看 | 色综合久久久久 | www.成人免费视频 | 亚洲精品在线视频 | 一级a爱片性色毛片免费 | av国产精品|