18.Python之生成器

Python之生成器

  1. 生成器

    • 在Python社區(qū),生成器和迭代器被看作一種工具,生成器的本質(zhì)就是迭代器。唯一的區(qū)別就是生成器是開(kāi)發(fā)人員自己用Python代碼構(gòu)建的數(shù)據(jù)結(jié)構(gòu),而迭代器是Python內(nèi)置提供或轉(zhuǎn)化而來(lái)的。
  2. 獲取生成器

    獲取生成器有3種方式:

    • 通過(guò)生成器函數(shù)獲取生成器

      只要函數(shù)中使用了yield關(guān)鍵字,這個(gè)函數(shù)就是生成器函數(shù),生成器函數(shù)使用函數(shù)名稱()不執(zhí)行生成器函數(shù)。在生成器函數(shù)內(nèi)部,通過(guò)關(guān)鍵字yield生成需要返回的值;生成器函數(shù)外,通過(guò)next(調(diào)用生成器函數(shù))來(lái)獲取一個(gè)yield的值,獲取yield值的過(guò)程中,執(zhí)行yield關(guān)鍵字之上的所有代碼,直到遇到yield停止代碼的執(zhí)行(但不會(huì)結(jié)束函數(shù)),返回yield的值,注意,使用一個(gè)next(調(diào)用函數(shù)),對(duì)應(yīng)獲取一個(gè)yield值。

      def func():
         print('Python')
         yield '第一個(gè)yield'
         print('生成器')
         yield '第二個(gè)yield'
         a = 1
         b = 2
         c = a + b
         print(c)
         yield '第三個(gè)yield'
      
      ret = func()
      print(next(ret))
      # 輸出結(jié)果:第一個(gè)yield
      print(next(ret))
      '''
      輸出結(jié)果:
      Python生成器
      第二個(gè)yield
      '''
      print(next(ret))
      '''
      輸出結(jié)果:
      3
      第三個(gè)yield
      '''
      # 如果next()和yield的調(diào)用次數(shù)不對(duì)應(yīng),會(huì)報(bào)錯(cuò)!'StopIteration(停止迭代)'
      
      # yiled form
      def func():
         l = [1,2,3,4,5]
         yield from l    # l將作為子生成器為next(ret)返回列表中的單一元素
      
      ret = func()
      print(next(ret))
      print(next(ret))
      print(next(ret))
      print(next(ret))
      print(next(ret))
      print(next(ret))
      '''
      輸出結(jié)果:
      1
      2
      3
      4
      5
      Traceback (most recent call last):
        File "C:/Users/BDHT/OneDrive/Python/Python3.8/test.py", line 14, in <module>
          print(next(ret))
      StopIteration
      '''
      
    • 通過(guò)生成器表達(dá)式獲取生成器

      生成器表達(dá)式與列表推導(dǎo)式的寫(xiě)法幾乎一摸一樣,將列表推導(dǎo)式的[]換成()就是生成器表達(dá)式,生成器表達(dá)式也有循環(huán)模式和篩選模式,多層循環(huán)構(gòu)建。

      列表推導(dǎo)式與生成器表達(dá)式的區(qū)別在于,生成器表達(dá)式更省內(nèi)存。

      # 使用列表推導(dǎo)式生成一個(gè)1到10的列表
      l = [i for i in range(1,11)]
      print(l)    # [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
      
      # 使用生成器表達(dá)式生成一個(gè)生成器(迭代器)
      l = (i for i in range(1,11))
      print(l)    # <generator object <genexpr> at 0x000002004151AA50>
      
      for i in l:
         print(i)
      '''
      輸出結(jié)果:
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      '''
      
    • Python內(nèi)部提供的一些生成器

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請(qǐng)通過(guò)簡(jiǎn)信或評(píng)論聯(lián)系作者。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容