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馅包子
#一直循环下去

'''

猜你喜欢

转载自blog.csdn.net/sinat_23110321/article/details/81165654
今日推荐