生成器:只有调用时才会生成相应的数据,以此能节省内存,只记录当前位置,并且只有一个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")