天天看點

python生成器及生成器并行運算

在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餡包子
#一直循環下去

'''