小談 python 生成器

2021-08-07 20:33:25 字數 2093 閱讀 5580

生成器:  迭代器的另一種操作,它能幹的事,list也都能幹,只不過在需要處理的序列比較大時,列表解析比較費記憶體。

生成器表示式: 通列表解析語法,只不過把列表解析的換成()

例如:>>> gen = (x**2 for x in range(5))

>>> gen

at 0x0000000002fb7b40>

>>> for g in gen:

...   print(g, end='-')

...0-1-4-9-16-

>>> for x in [0,1,2,3,4,5]:

...   print(x, end='-')

...0-1-2-3-4-5-

生成器函式:  在函式中如果出現了yield 關鍵字,稱這個函式為生成器函式

def odd():

n=1while true:

yield n

n+=2

odd_num = odd()

count = 0

for o in odd_num:

if count >=5: break

print(o)

count +=1

生成器是包含有__iter()和next__()方法的,所以可以直接使用for來迭代,迭代到最後會返回stopiteration前提是沒return  當然了 return 也不會返回值

其實相當於分解乙個迭代器,分解的條件是 yield 直到被 return 或者 stopiteration 當談論 如果在return後返回乙個值,

那麼這個值為stopiteration異常的說明,不是程式的返回值。 生成器是沒有辦法返回值的。

如def test():

yield 'a'

yield 'b'

return 'd'

yield 'abc'

tt = test()

print(next(tt))  這是定義大a

print(next(tt))  這是定義到b  後面有return 就不走 

生成器的一些方法:

close()  主動關閉生成器,後面的next 都是 stopiteration  通過 呼叫生成器返回的物件.close() 來實現

send() 接受外部的變數傳入  

這是生成器函式最難理解的地方,也是最重要的地方,實現後面的協程就全靠它了

如:def gen():

value=0

while true:

receive=yield value

print('引數值 =  ',receive)

if receive=='e':

break

value = 'got: %s' % receive

g=gen()

print(g.send(none))

print(g.send('aaa'))

print(g.send(3))

print(g.send('e'))

通過g.send(none)或者next(g)可以啟動生成器函式,並執行到第乙個yield語句結束的位置。

此時,執行完了yield語句,但是沒有給receive賦值。

yield value會輸出初始值0

注意:在啟動生成器函式時只能send(none),如果試圖輸入其它的值都會得到錯誤提示資訊。

通過g.send('aaa'),會傳入aaa,並賦值給receive,然後計算出value的值,並回到while頭部,執行yield value語句有停止。

此時yield value會輸出"got: aaa",然後掛起。

通過g.send(3),會重複第2步,最後輸出結果為"got: 3"

當我們g.send('e')時,程式會執行break然後推出迴圈,最後整個函式執行完畢,所以會得到stopiteration異常。

最後的執行結果如下:

0got: aaa

got: 3

traceback (most recent call last):

file "h.py", line 14, in

print(g.send('e'))

stopiteration

出自:

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 語句的函式,就是生成器函式,呼叫後返...