2018-06-20-Python全棧開發day19-生成器函數詳解
1.生成器函數
生成器函數,和普通函數的區別就是,
1.在生成器函數中使用yield代替return,而且yield可以被調用多次
2.當函數運行到yield時,會保留yield當前狀態,等待下一次next
用法示例:
def test(): yield 1 yield 2 yield 3 a=test() b=a.__next__() c=a.__next__() d=a.__next__() # print(b) print(c) print(d)
test函數中,有三個yield,每使用一次next方法,函數進行到一個yield之後,分別用bcd來接收返回值,
2.生成器函數的好處
和生成器一樣,好處就是可以隨時來進行運算,
和普通函數進行對比:
def shengchengqi(): for i in range(10000): yield ‘這是第%s個雞蛋‘ %i a= shengchengqi() b=a.__next__() print(b)
生成器函數,當你進行next函數時,才進行運算,每次運算時拿一個數據進內存,這樣可以很省內存空間
如果是普通函數的話
def putonghanshu(): s1=[] for i in range(10000): print(‘這是第%s個雞蛋‘ %i) a=putonghanshu()
只要函數運行,就將10000個數據全部放入內存,很容易占空間。
ps:疑問:這樣的話,那生成器函數是不是很復雜,每運行一次都要寫一段代碼。
引入for循環
3.將生成器函數引入for循環
編寫一個生成器函數
如果生成器函數運行的話,會從yield裏得到一個返回值,我們可以用abc來接收。
然後,可以對生成器函數使用next方法,可以使函數內的光標移到下一個yield之後,僅此而已,還是需要自己去找值接收。
def shengchengqi(): for i in range(10000):yield ‘這是第%s個雞蛋‘ %i a= shengchengqi() for b in a: print(b)
這時是自動運行,
分析:a=func().,開始運行函數,此時i=0,光標在yield之後。
for循環的概念,對一個對象,加上iter,然後一個一個的使用next方法,直到需要異常,然後返回,在for循環中,b直接接收了next之後的值。
4.並發運行
需求分析:兩個函數,一個函數運行時調用另一個函數,然後保存狀態如此往復。
def chibaozi(name): print(‘我開始吃包子了‘) while 1: baozi=yield print(‘這是我吃的包子 %s‘ %baozi) def zuo(): s1=chibaozi(‘yehaibin‘) s1.__next__() for i in range(10): s1.send(‘lvelvelve‘) zuo()
運行zuo的時候, 每循環一次,chibaozi就會做一次動作,然後保存狀態,這就是yield。#其實我現在還不太懂,挖個坑。
2018-06-20-Python全棧開發day19-生成器函數詳解