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

        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號
        主站蜘蛛池模板: 亚洲AV永久纯肉无码精品动漫| 992tv精品视频tv在线观看| 亚洲AV无码精品无码麻豆| 99久久精品免费看国产| 久久久久久亚洲Av无码精品专口| 精品国产毛片一区二区无码| 久久精品成人国产午夜| 久久国产精品无码HDAV| 日本Aⅴ大伊香蕉精品视频| 91精品久久久久久无码| 丰满人妻熟妇乱又仑精品| 亚洲AV成人精品网站在线播放 | 国产999精品久久久久久| 国产成人精品无码一区二区| 中国国产精品| 久久久久久噜噜精品免费直播| 99视频在线精品国自产拍亚瑟 | 国产精品网站在线观看| 久久亚洲精品人成综合网| 中文字幕精品亚洲无线码一区| 久久精品国产黑森林| 国内精品久久久久久久久电影网| 欧美精品888| 国内精品久久久久久久涩爱| 亚洲精品欧美综合| 国产精品你懂得| 99久久精品日本一区二区免费| 色一乱一伦一图一区二区精品 | 久久99久久99小草精品免视看| 国产精品影音先锋| 国产精品久久久久久| 国产精品久久网| 国产福利视精品永久免费 | 人妻少妇精品中文字幕av蜜桃| 中文无码精品一区二区三区| 欧美亚洲成人精品| 四虎影院国产精品| 亚洲精品视频免费| 亚洲精品午夜无码电影网| 亚洲日韩精品无码专区网址| 自拍偷在线精品自拍偷无码专区 |