在Python中,一邊循環一邊計算的機制,稱為生成器。
生成器是指在生成時隻先占用記憶體,當調用時才開始執行算法生成結果。這樣就不必建立完整的list,進而節省大量的空間。
建立list和generator的差別僅在于最外層的[]和(),L是一個list,而g是一個generator。
L = [x * x for x in range(10)]
g = (x * x for x in range(10))
在函數中隻要把printf改為yield
每次調用next()的時候執行,遇到yield語句傳回,再次執行時從上次傳回的yield語句處繼續執行。
max = int(input("max:"))
def fib(max):
a,b,i = 0,1,0
while i<max :
yield b#生成器<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
a , b = b , a+b
i+=1
'''
生成方式1
for i in fib(max):
print(i)
'''
#生成方式2
f=fib(max)
while True:#對生成器進行循環,循環到最後捕捉異常,結束循環
try:
x=next(f)#生成器,回到上次傳回的yield>>>>>>>>>>>>>>>>>>>>>>>>>>
print(x)
except StopIteration as e:
break
知識補充:
a,b = b,a+b
相當于
t=a
a=b
b=t+b
該式子運算時先對等号右邊的式子進行運算
假設a=2,b=3
那麼a,b = b,a+b
表示a,b = 3,5
生成器并行運算
import time
def customer(name):#消費者
print("start eat")
while True:
baozi=yield
print("%s吃了%s餡包子"%(name,baozi)) #顯示yield接收到的資料
def prudecter():#生産者
xian1 = customer("A")#生成生成器
xian2 = customer("B")
xian1.__next__()#使生成器執行到yield
xian2.__next__()
print("start make baozi")
while True:
time.sleep(1)#暫停1s
print("baozi is ok")
xian1.send("jiucai")#發送給yield資料,并複制給baozi
xian2.send("dasuan")
prudecter()#程式入口
'''
結果
start eat #執行了A的__next__到yield
start eat #執行了B的__next__到yield
start make baozi
baozi is ok
A吃了jiucai餡包子 #顯示了A傳送的資料
B吃了dasuan餡包子
baozi is ok
A吃了jiucai餡包子
B吃了dasuan餡包子
baozi is ok
A吃了jiucai餡包子
B吃了dasuan餡包子
#一直循環下去
'''