生成器:只有调用时才会生成相应的数据,以此能节省内存,只记录当前位置,并且只有一个next()方法。
def fib(max): n,a,b=0,0,1 while n<max:#n<10 print(b) a,b=b,a+b # 不是 a=1,b=2,a=b,a=2 b=a+b b=2+2=4 #而是t=(b,a+b) a=t[0] b=t[1] 但不必显示写出临时变量t就可以赋值 n=n+1 return "done" fib(10)将函数构成生成器
def fib(max): n,a,b=0,0,1 while n<max:#n<10 yield b #使用关键字yield,则该函数就变成了一个生成器,想把谁返回出去,就在谁的前面加关键字yield,返回当前状态的值 a,b=b,a+b # 不是 a=1,b=2,a=b,a=2 b=a+b b=2+2=4 #而是t=(b,a+b) a=t[0] b=t[1] 但不必显示写出临时变量t就可以赋值 n=n+1 f=fib(10) print(f.__next__())#只能往后,不能往前,也不能像列表一样一下子取出指定的值,只能循环一个个的取 print(f.__next__()) print(f.__next__())协程,单线程具有并发的效果
import time def consumer(name): print("%s开始生产"%name) while True: baozi=yield #没有send时为空,通过send方法给yield,也就是给baozi print("包子[%s]来了,被[%s]吃了"%(baozi,name)) def producer(name): c=consumer("A")#这个只是将该函数变成了一个生成器 c2=consumer("B") c.__next__()#只有这样才能print("%s开始生产"%name),走yield处返回 c2.__next__() print("开始做包子了") for i in range(10): time.sleep(1) print("做了1个包子,分两半") c.send(i)#通过send方法将i 赋值给yield,直接从中断的位置开始执行,即从print("包子[%s]来了,被[%s]吃了"%(baozi,name))开始 c2.send(i) producer("Alex")