理解 Python 生成器

2022-02-24 21:53:14 字數 3884 閱讀 6820

【什麼時候呼叫,什麼時候計算並返回值】:生成器僅僅儲存了一套生成數值的演算法,並且沒有讓這個演算法現在就開始執行,而是我什麼時候調它,它什麼時候開始計算乙個新的值,並給你返回。在python中,一邊迴圈一邊計算的機制,稱為生成器:generator。【列表耗記憶體】:列表所有資料都在記憶體中,如果有海量資料的話將會非常耗記憶體。

【空間浪費】:如果僅僅需要訪問前面幾個元素,那後面絕大多數元素占用的空間都白白浪費了。

【迴圈中不斷推算】:如果列表元素按照某種演算法推算出來,那我們就可以在迴圈的過程中不斷推算出後續的元素,這樣就不必建立完整的list,從而節省大量的空間。

【我又想要得到龐大的資料,又想讓它占用空間少,那就用生成器!】【只要把乙個列表生成式的改成()】:就建立了乙個generator

例如將l = [x * x for x in range(10)] 變成 g = (x * x for x in range(10))

【函式中包含yield關鍵字】:如果乙個函式中包含yield關鍵字,那麼這個函式就不再是乙個普通函式,而是乙個generator。呼叫函式就是建立了乙個生成器(generator)物件。【next()方法】:生成器(generator)能夠迭代的關鍵是它有乙個next()方法,

【重複呼叫next()方法】:工作原理就是通過重複呼叫next()方法,直到捕獲乙個異常。

【.send()和next()都能讓生成器繼續往下走一步】:.send() 和next()一樣,都能讓生成器繼續往下走一步(下次遇到yield停),但send()能傳乙個值,這個值作為yield表示式整體的結果下次迭代時,**從yield的下一條語句開始執行

#

encoding:utf-8

defyield_test(n):

for i in

range(n):

yield

call(i)

print("i="

,i)

print("

done.")

defcall(i):

return i*2

for i in yield_test(5):

print(i,","

)#>0 ,

i=0

2,

i= 1

4,

i= 2

6,

i= 3

8,

i= 4done.>>>

**或參考:徹底理解 python 生成器

在python中,一邊迴圈一邊計算的機制,稱為生成器:generator。

列表所有資料都在記憶體中,如果有海量資料的話將會非常耗記憶體。

如:僅僅需要訪問前面幾個元素,那後面絕大多數元素占用的空間都白白浪費了。

如果列表元素按照某種演算法推算出來,那我們就可以在迴圈的過程中不斷推算出後續的元素,這樣就不必建立完整的list,從而節省大量的空間。

簡單一句話:我又想要得到龐大的資料,又想讓它占用空間少,那就用生成器!

第一種方法很簡單,只要把乙個列表生成式的改成(),就建立了乙個generator:

>>> l = [x * x for x in range(10)]

>>>l

[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

>>> g = (x * x for x in range(10))

>>>g

at 0x1022ef630>

建立lg的區別僅在於最外層的()l是乙個list,而g是乙個generator。

方法二, 如果乙個函式中包含yield關鍵字,那麼這個函式就不再是乙個普通函式,而是乙個generator。呼叫函式就是建立了乙個生成器(generator)物件。

(1)生成器(generator)能夠迭代的關鍵是它有乙個next()方法,

工作原理就是通過重複呼叫next()方法,直到捕獲乙個異常。

(2)帶有 yield 的函式不再是乙個普通函式,而是乙個生成器generator。

可用next()呼叫生成器物件來取值。

next 兩種方式 t.__next__()  |  next(t)。

可用for 迴圈獲取返回值(每執行一次,取生成器裡面乙個值)

(基本上不會用next()來獲取下乙個返回值,而是直接使用for迴圈來迭代)。

(3)yield相當於 return 返回乙個值,並且記住這個返回的位置,下次迭代時,**從yield的下一條語句開始執行。

(4).send() 和next()一樣,都能讓生成器繼續往下走一步(下次遇到yield停),但send()能傳乙個值,這個值作為yield表示式整體的結果

——換句話說,就是send可以強行修改上乙個yield表示式值。比如函式中有乙個yield賦值,a = yield 5,第一次迭代到這裡會返回5,a還沒有賦值。第二次迭代時,使用.send(10),那麼,就是強行修改yield 5表示式的值為10,本來是5的,那麼a=10

感受下yield返回值的過程(關注點:每次停在哪,下次又開始在哪

)及send()傳參的通訊過程,

思考none是如何產生的(第一次取值:yield 返回了 i 值 0,停在yield i,temp沒賦到值。第二次取值,開始在print,temp沒被賦值,故列印none,i加1,繼續while判斷,yield  返回了 i 值 1,停在yield i):

好了,話不多說,翠花,上栗子:

1

#encoding:utf-8

2def

yield_test(n):

3for i in

range(n):

4yield

call(i)

5print("i="

,i)

6print("

done.

") 78

defcall(i):

9return i*2

1011

for i in yield_test(5):

12print(i,"

,")

結果:

>>>0 ,  

i=0

2,

i= 1

4,

i= 2

6,

i= 3

8,

i= 4done.

>>>

什麼是生成器?

生成器僅僅儲存了一套生成數值的演算法,並且沒有讓這個演算法現在就開始執行,而是我什麼時候調它,它什麼時候開始計算乙個新的值,並給你返回。

def

count_down(n):

while n >=0:

newn = yield

n

print('

newn

', newn)

ifnewn:

print('if'

) n =newn

print('

n ='

, n)

else

: n -= 1cd = count_down(5)

for i in

cd:

print(i, ','

)

if i == 5:

cd.send(3)

結果:

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 生成器函式

一 生成器 生成器指的是生成器物件,可由生成器表示式得到,也可使用 yield 關鍵字得到乙個生成器函式,呼叫這個函式得到乙個生成器物件 生成器物件,是乙個可迭代物件,是乙個迭代器 生成器物件,是延遲計算 惰性求值的 1.1 生成器函式 函式體重包含 yield 語句的函式,就是生成器函式,呼叫後返...