日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python基础教程:内置类型之生成器

發布時間:2025/3/20 python 11 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python基础教程:内置类型之生成器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

生成器的定義方式有兩種

  • 一種是調用生成器函數
  • 一種是使用生成器表達式語法

調用生成器函數

生成器函數是指在函數體中使用yield表達式僅返回結果的函數。yield表達式僅在定義生成器函數時使用,因此只能用在函數定義的主體中。在函數體中使用yield表達式會使該函數成為生成器函數。當生成器函數被調用時,它返回一個稱為生成器的迭代器,該迭代器由python自動生成。

然后,生成器控制了生成器函數的執行。因為返回的生成器是一個迭代器,所以生成器函數的執行結果也就可以被循環。當生成器的的__next__方法被調用時,生成器函數的函數體內的語句開始執行,執行進行到第一個yield表達式時,立即將yield表達式的結果返回給生成器的調用者,同時將生成器函數內部的狀態掛起。

即保持生成器函數的執行進度,和生成器函數內的局部狀態:包括局部變量的當前綁定,指令指針,內部計算棧和任何異常處理的狀態。當生成器的再次調用__next__方法來時,生成器函數恢復執行,并再次執行到yield表達式返回結果再保持狀態,直到無法再執行到yield表達式。此時生成器自動拋出StopIteration異常。

我們先定義一個簡單生成器函數,函數功能返回數字0-9的平方數

# 生成器函數,功能返回數字0-9的平方數 >>> def squares():for i in range(10):yield i**2# 使用return關鍵字是普通函數,使用yield關鍵字函數變成了生成器函數

使用參數g接收調用生成器函數squares的結果,然后分別在shell查看squares和g這兩個變量的類型

''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:531509025 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' >>> g = squares()#查看squares對象類型 >>> squares <function squares at 0x035950C0>#查看g對象類型 >>> g <generator object squares at 0x0358A930>

從上面可以看出變量squares是函數類型,變量g是generator類型對象,generator從字面的理解上就是生成器類型。

根據上一節迭代器中提到的知識,從collection模塊引入Iterator的抽象基類,驗證下generator類型是不是上面說的迭代器類型。

>>> from collections import Iterator >>> isinstance(g,Iterator) True

驗證成功,說明生成器函數的執行結果確實是生成器,一種特殊的迭代器。

>>> for i in g:print (i)0 1 4 9 16 25 36 49 64 81

生成器表達式

除了使用生成器函數可以得到生成器,還可以生成器表達式得到生成器表達式。

生成器表達式本身看起來像列表推到, 但不是用方括號而是用圓括號包圍起來:

''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:531509025 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' >>> g2 = (x**2 for x in range(10)) >>> g2 <generator object <genexpr> at 0x0359AFC0>>>> t = (1,2,3,4,5) >>> g3 = (x**2 for x in t) >>> g3 <generator object <genexpr> at 0x007F6180>

驗證:

>>> isinstance(g2,Iterator) True>>> isinstance(g3,Iterator) True

使用:

''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:531509025 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' >>> for i in g2:print(i)0 1 4 9 16 25 36 49 64 81>>> for i in g3:print(i)1 4 9 16 25

和普通迭代器相比,生成器不單簡化了迭代器的定義,還在使用效率上有提升。因為生成器在循環時,生成器函數每次只會返回一個結果,然后保持內部狀態,所以生成器占用的內存是很小的。

以下兩個測試結果,第一個直接拋出MemoryError異常,第二個只能正確計算出結果。

# 全部數據先加載在1個列表上面,內存占用高 >>> s1 = sum([i for i in range(100000000)]) Traceback (most recent call last):File "<pyshell#6>", line 1, in <module>s1 = sum([i for i in range(100000000)])File "<pyshell#6>", line 1, in <listcomp>s1 = sum([i for i in range(100000000)]) MemoryError# 數據幾乎不占內存 >>> s2 = sum((i for i in range(100000000))) >>> s2 4999999950000000 與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的Python基础教程:内置类型之生成器的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。