若是看完這篇文章,你仍是弄不明白yield,
你來找我,我保證不打你,我給你發100的大紅包。python
想要產生一個無窮的可迭代對象,每次生成一個隨機數;
問題:使用while循環,存放到列表中,內存有限,不可行dom
生成器函數:python中帶yield關鍵字函數,成爲生成器函數
一個例子:ide
import random def genRandom(): #yield關鍵字 yield random.randint(0,1000) #genRandom的返回值不是None, #genfunc是一個:generator,生成器 genfunc = genRandom() print(type(genfunc)) #genfunc使用next調用,返回產生的隨機數 r = next(genfunc) print(r)
結果:函數
<class 'generator'> 803
分析:genfunc爲生成器對象;調試
加入調試信息,觀察生成器函數執行過程code
import random def genRandom(): #yield關鍵字 r = random.randint(0,1000) print('befor yield') yield r print('after yield') genfunc = genRandom()
print(next(genfunc))
結果:沒有執行:print('after yield')對象
befor yield 726
分析:調用yield以後,返回產生隨機數:314,而後中止內存
print(next(genfunc))
結果:generator
after yield StopIteration Traceback (most recent call last)
分析:執行yield下一條語句,並報異常。
緣由:經過異常告知調用者,生成器執行結束;
若是想要再次執行生成器,必須從新建立生成器對象。it
一個例子:
import random def genRandom(): print('--->1') yield random.randint(0,1000) print('--->2') yield random.randint(0,1000) print('--->3') genfunc = genRandom() next(genfunc) next(genfunc) next(genfunc)
結果:最後一次調用報異常;
--->1 --->2 --->3 StopIteration:
genfunc = genRandom() for item in genfunc: print(item)
結果:沒有問題,由於for循環處理了StopIteration異常
--->1 728 --->2 192 --->3
再次調用:
for item in genfunc: print(item)
沒有任何結果,
1.生成器函數內部yield都執行完以後,不能再次使用;
2.須要從新建立新的生成器對象
代碼:
import random def genRandom(): #yield關鍵字 while True: r = random.randint(0,1000) print('befor yield') yield r print('after yield') genfunc = genRandom() for i in range(10): print(next(genfunc)) for i in range(10000): print(next(genfunc))
結果:能夠看到,能夠產生無窮盡的隨機數
1.帶yield關鍵字的函數,返回生成器對象;2.yield關鍵字保存程序運行上下文3.生成器能夠經過for或者next進行調用,注意異常處理;4.生成器對象執行完,須要從新建立生成器對象