python yield和yield from用法總結(jié)詳解

發(fā)布時(shí)間:2024-03-06
python yield和yield from用法總結(jié)yield 作用:
注: generator的next()方法在python 2中為next(),但在python 3中為 __next__() 【next的前后各是兩個(gè)下劃線】
把一個(gè)函數(shù)變成一個(gè)generator,帶有yield的函數(shù)不再是一個(gè)普通函數(shù)。即:一個(gè)帶有 yield 的函數(shù)就是一個(gè) generator,它和普通函數(shù)不同,生成一個(gè) generator 看起來(lái)像函數(shù)調(diào)用,但不會(huì)執(zhí)行任何函數(shù)代碼,直到對(duì)其調(diào)用 next()(在 for 循環(huán)中會(huì)自動(dòng)調(diào)用 next())才開(kāi)始執(zhí)行。雖然執(zhí)行流程仍按函數(shù)的流程執(zhí)行,但每執(zhí)行到一個(gè) yield 語(yǔ)句就會(huì)中斷,并返回一個(gè)迭代值,下次執(zhí)行時(shí)從 yield 的下一個(gè)語(yǔ)句繼續(xù)執(zhí)行。看起來(lái)就好像一個(gè)函數(shù)在正常執(zhí)行的過(guò)程中被 yield 中斷了數(shù)次,每次中斷都會(huì)通過(guò) yield 返回當(dāng)前的迭代值。
yield 的好處是顯而易見(jiàn)的,把一個(gè)函數(shù)改寫為一個(gè) generator 就獲得了迭代能力,比起用類的實(shí)例保存狀態(tài)來(lái)計(jì)算下一個(gè) next() 的值,不僅代碼簡(jiǎn)潔,而且執(zhí)行流程異常清晰。
用print實(shí)現(xiàn)打印斐波拉切數(shù)列 ——基礎(chǔ)版
#!/usr/bin/env python# -*- coding: utf-8 -*-def fab(max): n , a, b = 0, 0 , 1 while n < max: print(b) a, b = b, a b n = n 1if __name__ == '__main__': fab(6) # 1 1 2 3 5 8用yield實(shí)現(xiàn)打印斐波拉切數(shù)列——升級(jí)版
#!/usr/bin/env python# -*- coding: utf-8 -*-def fab(max): n , a, b = 0, 0 , 1 while n < max: yield b a, b = b, a b n = n 1if __name__ == '__main__': for n in fab(6): # 1 1 2 3 5 8 print(n)如何判斷一個(gè)函數(shù)是否是一個(gè)特殊的generator函數(shù)
#!/usr/bin/env python# -*- coding: utf-8 -*-from inspect import isgeneratorfunctiondef fab(max): n , a, b = 0, 0 , 1 while n < max: yield b a, b = b, a b n = n 1if __name__ == '__main__': f1 = fab(3) # true fab是一個(gè)generator function print(isgeneratorfunction(fab)) # false fab(3)不是一個(gè)generator function # 而fab(3)是調(diào)用fab返回的一個(gè)generator print(isgeneratorfunction(fab(3)))用yield實(shí)現(xiàn)大文件讀取
#!/usr/bin/env python# -*- coding: utf-8 -*-def read_file(fpath): block_size = 100 with open(fpath, "rb") as f: while true: block = f.read(block_size) if block: yield block else: returnif __name__ == '__main__': fpath = "/home/exercise-python3.7.1/vote/mysite/mysite/polls/test.txt" read_gen = read_file(fpath) print(read_gen.__next__()) print(read_gen.__next__()) print(read_gen.__next__()) print(read_gen.__next__()) # for循環(huán)會(huì)自動(dòng)調(diào)用generatr的__next__()方法,故輸出效果同如上的4個(gè)print 【內(nèi)容較短,4個(gè)print就將test.txt中的內(nèi)容輸出完了】 for data in read_gen: print(data)yield 和 yield from 用法對(duì)比使用yield拼接可迭代對(duì)象
#!/usr/bin/env python# -*- coding: utf-8 -*-if __name__ == '__main__': astr = "abc" alist = [1, 2, 3] adict = {"name": "wangbm", "age": 18} # generate agen = (i for i in range(4, 8)) def gen(*args, kw): for item in args: for i in item: yield i new_list = gen(astr, alist, adict, agen) print(list(new_list)) # ['a', 'b', 'c', 1, 2, 3, 'name', 'age', 4, 5, 6, 7]使用yield from拼接可迭代對(duì)象
#!/usr/bin/env python# -*- coding: utf-8 -*-if __name__ == '__main__': astr = "abc" alist = [1, 2, 3] adict = {"name": "wangbm", "age": 18} # generate agen = (i for i in range(4, 8)) def gen(*args, kw): for item in args: yield from item new_list = gen(astr, alist, adict, agen) print(list(new_list)) # ['a', 'b', 'c', 1, 2, 3, 'name', 'age', 4, 5, 6, 7]結(jié)論:
由上面兩種方式對(duì)比,可以看出,yield from后面加上可迭代對(duì)象,他可以把可迭代對(duì)象里的每個(gè)元素一個(gè)一個(gè)的yield出來(lái),對(duì)比yield來(lái)說(shuō)代碼更加簡(jiǎn)潔,結(jié)構(gòu)更加清晰。
相關(guān)學(xué)習(xí)推薦:python視頻教程
上一個(gè):一張茶席,成全一份深情
下一個(gè):紅松種子變溫催芽處理技巧

榮耀手機(jī)安裝包在哪個(gè)文件夾(榮耀的安裝包在哪)
欠款人無(wú)力償還是不是坐牢就不用還了
結(jié)婚宴席菜單12個(gè)菜
2013年最具影響力茶博會(huì)花落誰(shuí)家?
蘋果電腦怎么重新連接wifi(蘋果電腦怎么重新連接無(wú)線網(wǎng)絡(luò))
四斑絹野螟
綠茶噴霧結(jié)合早期活動(dòng)對(duì)老年腹部術(shù)后患者胃腸功能恢復(fù)的影響
盜竊槍支罪既遂可以追究什么刑事責(zé)任?
RTA03-4C272JTP排阻,旺詮RJ4C03-2.7K
3m公司簡(jiǎn)介_(kāi)所有品牌_發(fā)展歷程
十八禁 网站在线观看免费视频_2020av天堂网_一 级 黄 色 片免费网站_绝顶高潮合集Videos