国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

深入淺析Python中的yield關(guān)鍵字

2020-02-22 22:58:26
字體:
供稿:網(wǎng)友

前言

python中有一個(gè)非常有用的語法叫做生成器,所利用到的關(guān)鍵字就是yield。有效利用生成器這個(gè)工具可以有效地節(jié)約系統(tǒng)資源,避免不必要的內(nèi)存占用。

一段代碼

def fun():for i in range(20): x=yield i print('good',x)if __name__ == '__main__':a=fun()a.__next__()x=a.send(5)print(x)

這段代碼很短,但是詮釋了yield關(guān)鍵字的核心用法,即逐個(gè)生成。在這里獲取了兩個(gè)生成器產(chǎn)生的值,即0和1。分別由next函數(shù)和send()函數(shù)獲得,這兩個(gè)函數(shù)的區(qū)別我們后面會(huì)詳細(xì)闡述。

關(guān)于__next__函數(shù),這里先說明一下,我們可以利用__next__()這個(gè)函數(shù)持續(xù)獲取符合fun函數(shù)規(guī)則的數(shù),直到19結(jié)束。這段代碼如下所示:

def fun():for i in range(20): x=yield iif __name__ == '__main__':for x in fun(): print(x)

這段代碼的效果和下面這段代碼是完全相同的

if __name__ == '__main__':for i in range(20): x=yield i

for..in調(diào)用生成器算是生成器的基礎(chǔ)用法,不過只會(huì)用for..in意義是不大的。生成器中最重要的函數(shù)是sent和__next__這兩個(gè)函數(shù),下面就針對(duì)這兩個(gè)函數(shù)進(jìn)行詳細(xì)的闡述。

sent函數(shù)

這里特別強(qiáng)調(diào)了sent函數(shù),因?yàn)閟ent函數(shù)沒有那么直觀。__next__函數(shù)很好理解,就是從上一個(gè)終止點(diǎn)開始,到下一個(gè)yield結(jié)束,返回值就是yield表達(dá)式的值。

例如在初始的那段代碼里:

def fun():for i in range(20): x=yield i print('good',x)

第一次調(diào)用__next__函數(shù)的時(shí)候,我們從fun的起點(diǎn)開始,然后在yield處結(jié)束,需要注意的是,賦值語句不會(huì)調(diào)用,此處yield i和含義和return差不多。

但是第二次調(diào)用__next__函數(shù)的時(shí)候,就會(huì)直接從上一個(gè)yield的結(jié)束處開始,也就是先執(zhí)行賦值語句,然后輸出字符串,進(jìn)入下一個(gè)循環(huán),直到下一個(gè)yield或者生成器結(jié)束

再次看初始的那段代碼,可以發(fā)現(xiàn)第二次調(diào)用的時(shí)候沒有選擇使用__next__函數(shù),而是使用了一個(gè)sent()函數(shù)。這里就需要注意,sent()函數(shù)的用法和__next__函數(shù)不太一樣。sent()函數(shù)只能從yield之后開始,到下一個(gè)yield結(jié)束。這也就意味著第一次調(diào)用必須使用__next__函數(shù)。

sent()函數(shù)最重要的作用在于它可以給yield對(duì)應(yīng)的賦值語句賦值,比如上面那一段代碼中的

x=yield i

如果調(diào)用__next()__函數(shù),那么x=None。但是如果調(diào)用sent(5),那么x=5。除了上述將的兩個(gè)特征以外,sent和next并沒有什么區(qū)別,sent函數(shù)也會(huì)返回yield表達(dá)式對(duì)應(yīng)的值

next函數(shù)調(diào)用次可能有限

需要特別注意的是,盡管是生成器。但是next函數(shù)的調(diào)用次數(shù)可能是有限的。比如下面這段代碼

def fun():for i in range(20): x=yield i print('good',x)if __name__ == '__main__':a=fun()for i in range(30): x=a.__next__() print(x)            
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 高碑店市| 菏泽市| 香港 | 潍坊市| 乌鲁木齐市| 民丰县| 达州市| 京山县| 虹口区| 日土县| 武义县| 巴东县| 皋兰县| 东乌珠穆沁旗| 栾城县| 邳州市| 湘潭市| 体育| 明星| 桐庐县| 连山| 中西区| 宿松县| 靖州| 哈尔滨市| 五大连池市| 麦盖提县| 玉田县| 渑池县| 法库县| 津市市| 墨江| 上犹县| 汉寿县| 郴州市| 綦江县| 武平县| 密云县| 凤山县| 淮安市| 雷波县|