站長資訊網
最全最豐富的資訊網站

python yield和yield from用法總結詳解

python yield和yield from用法總結詳解

python yield和yield from用法總結

yield 作用:

注: generator的next()方法在python 2中為next(),但在python 3中為 __next__() 【next的前后各是兩個下劃線】

  把一個函數變成一個generator,帶有yield的函數不再是一個普通函數。即:一個帶有 yield 的函數就是一個 generator,它和普通函數不同,生成一個 generator 看起來像函數調用,但不會執行任何函數代碼,直到對其調用 next()(在 for 循環中會自動調用 next())才開始執行。雖然執行流程仍按函數的流程執行,但每執行到一個 yield 語句就會中斷,并返回一個迭代值,下次執行時從 yield 的下一個語句繼續執行??雌饋砭秃孟褚粋€函數在正常執行的過程中被 yield 中斷了數次,每次中斷都會通過 yield 返回當前的迭代值。

yield 的好處是顯而易見的,把一個函數改寫為一個 generator 就獲得了迭代能力,比起用類的實例保存狀態來計算下一個 next() 的值,不僅代碼簡潔,而且執行流程異常清晰。

用print實現打印斐波拉切數列 ——基礎版

#!/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實現打印斐波拉切數列——升級版

#!/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)

如何判斷一個函數是否是一個特殊的generator函數

#!/usr/bin/env python # -*- coding: utf-8 -*-from inspect import isgeneratorfunction  def 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是一個generator function     print(isgeneratorfunction(fab))      # False fab(3)不是一個generator function     # 而fab(3)是調用fab返回的一個generator    print(isgeneratorfunction(fab(3)))

用yield實現大文件讀取

#!/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循環會自動調用generatr的__next__()方法,故輸出效果同如上的4個print  【內容較短,4個print就將test.txt中的內容輸出完了】    for data in read_gen:         print(data)

yield 和 yield from 用法對比

使用yield拼接可迭代對象

#!/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拼接可迭代對象

#!/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]

結論:
  由上面兩種方式對比,可以看出,yield from后面加上可迭代對象,他可以把可迭代對象里的每個元素一個一個的yield出來,對比yield來說代碼更加簡潔,結構更加清晰。

相關學習推薦:python視頻教程

贊(0)
分享到: 更多 (0)
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
久久国产精品99精品国产987| 国产精品国产三级国产a| 69久久精品无码一区二区| 亚洲欧洲国产精品你懂的| 久久er国产精品免费观看2| 精品久久久久久无码人妻蜜桃| 四虎成人精品在永久在线| 日韩一级电影在线观看| 2015日韩永久免费视频播放| 午夜国产精品久久久久| 国产精品素人福利| 精品国产亚洲一区二区三区在线观看| 色综合久久精品亚洲国产| 最新亚洲精品国偷自产在线| 一级一级特黄女人精品毛片视频| 中文天堂最新版在线精品| 亚洲精品中文字幕麻豆| 亚洲依依成人精品| www.精品国产| 69SEX久久精品国产麻豆| 2021国内久久精品| 亚洲人精品亚洲人成在线| 992tv精品视频tv在线观看| 久久久久久午夜精品| 在线精品一区二区三区| 国产精品亚洲专区无码WEB| 老色鬼永久精品网站| 国产精品自在线天天看片| 国产精品久久久久久久久电影网| 国产精品免费视频播放器| 国产大片51精品免费观看| 日韩午夜在线观看| 中文字幕一区日韩精品| 老湿机一区午夜精品免费福利| 无码精品蜜桃一区二区三区WW| 国产成人精品免费大全| 久久伊人精品青青草原日本| 中文字幕日韩精品无码内射| 亚洲AV无码成人精品区在线观看| 午夜精品在线观看| 亚洲精品第五页中文字幕|