生成器: 迭代器的另一種操作,它能幹的事,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 語句的函式,就是生成器函式,呼叫後返...