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