生成器物件

2021-08-18 06:46:53 字數 2080 閱讀 8128

python的for語句迴圈本質上就是通過呼叫iterable可迭代物件的__iter()__方法獲得乙個iterator迭代器物件,然後不斷呼叫iterator迭代器物件__next()__方法實現的。iterator迭代器物件則是乙個需要實現__iter__()和__next__()兩個迭代器協議方法的物件。python中生成器提供了一種方便的方法來實現迭代器協議,而不需要必須實現__iter__()和__next__()兩個迭代器協議方法。

生成器的定義方式有兩種,一種是呼叫生成器函式,一種是使用生成器表示式語法。

# 生成器函式,功能返回數字0-9的平方數

>>>

defsquares

():for i in range(10):

yield i**2

# 使用return關鍵字是普通函式,使用yield關鍵字函式變成了生成器函式

>>> g = squares()

#檢視squares物件型別

>>> squares

0x035950c0>

#檢視g物件型別

>>> g

0x0358a930>

從上面可以看出變數squares是函式型別,變數g是generator型別物件,generator從字面的理解上就是生成器型別。根據上一節迭代器中提到的知識,從collection模組引入iterator的抽象基類,驗證下generator型別是不是上面說的迭代器型別。
>>> 

from collections import iterator

>>> isinstance(g,iterator)

true

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

for i in g:

print (i)01

491625

3649

6481

>>> g2 = (x**2

for x in range(10))

>>> g2

at 0x0359afc0>

>>> t = (1,2,3,4,5)

>>> g3 = (x**2

for x in t)

>>> g3

at 0x007f6180>

# 驗證

>>> isinstance(g2,iterator)

true

>>> isinstance(g3,iterator)

true

#使用》

for i in g2:

print(i)01

491625

3649

6481

>>>

for i in g3:

print(i)14

91625

和普通迭代器相比,生成器不單簡化了迭代器的定義,還在使用效率上有提公升。因為生成器在迴圈時,生成器函式每次只會返回乙個結果,然後保持內部狀態,所以生成器占用的記憶體是很小的。以下兩個測試結果,第乙個直接丟擲memoryerror異常,第二個只能正確計算出結果。
# 全部資料先載入在1個列表上面,記憶體占用高

>>> s1 = sum([i for i in range(100000000)])

traceback (most recent call last):

file "", line

1, in

s1 = sum([i for i in range(100000000)])

file "", line

1, in

s1 = sum([i for i in range(100000000)])

memoryerror

# 資料幾乎不佔記憶體

>>> s2 = sum((i for i in range(100000000)))

>>> s2

4999999950000000

python 生成器作用 Python生成器

生成器介紹 在函式內部包含yield關鍵字,那麼該函式執行的結果是生成器,生成器就是迭代器。生成器的功能 把函式結果做成迭代器 以一種優雅的方式封裝好iter,next 提供了一種自己定義迭代器的方式。使用生成器建立乙個迭代器 def a print a yield 11 使用yield,執行後返回...

python生成器好處 Python生成器筆記

python中三大器有迭代器,生成器,裝飾器,本文主要講述生成器。主要從生成器的概念,本質,以及yield關鍵字的使用執行過程。本質 生成器是一類特殊的迭代器,使用了yield關鍵字的函式不再是函式,而是生成器。使用了yield的函式就是生成器 1.yield關鍵字有兩點作用 1.1 yield語句...

古文生成器python python(生成器)

生成器 先從列表生成式說起 可以通過簡單的式子,生成有規律的列表 如果把 換為 會發生什麼呢?看到 x 存的不再是列表,而是乙個位址,而這個位址就是我們的生成器物件的位址 這東西有什麼用呢?當然時,節省記憶體啦 假設現在有很龐大的一組資料要處理,貌似不可能把它一次性載入記憶體再進行處理,這時候就體現...