#函数中的生成器:generator。
#函数中包含yield语句,该函数不在是一个普通函数,会被特地的编译成生成器,当函数被调用时,他们返回一个生成器对象
#每当遇到yield的时候,可以当成return
#yield可以通过next()调用也可以通过send赋予值
实例:
斐波拉契数列:
#著名的斐波拉契数列(Fibonacci),除第一个和第二个数外,任意一个数都可由前两个数相加得到:
#1, 1, 2, 3, 5, 8, 13, 21, 34, ...
def fib(max):
n,a,b=0,0,1
while n<max:
print (b)
#赋值语句
a,b=b,a+b
n +=1
return 'done'
fib(10)
仔细观察,可以看出,fib函数实际上是定义了斐波拉契数列的推算规则,可以从第一个元素开始,推算出后续任意的元素,这种逻辑其实非常类似generator。
也就是说,上面的函数和generator仅一步之遥。要把fib函数变成generator,只需要把print(b)改为yield b就可以了:
def fib(max):
n,a,b=0,0,1
while n<max:
# print (b)
#利用yield返回一个生成器
#generator和函数的执行流程不一样。函数是顺序执行,遇到return语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。
yield b
#赋值语句
a,b=b,a+b
n +=1
for i in fib(10):
print i
print("做点其他事情")
使用yield处理,得到的结果是相同的
生成器并行(异步io初级模型)
import time
#消费 吃包子
def consumer(name):
print("%s 准备吃包子啦!") %name
while True:
baozi=yield
print ("包子[%s]来了,被[%s]吃了!" %(baozi,name))
#c =consumer("chao")
#c.next()
#b1="韭菜馅"
#send可以给yield传值,并且带有next功能
#c.send(b1)
#c.next()
#生产 做包子
def producer(name):
c=consumer("A")
c2=consumer("B")
c.next()
c2.next()
print ("开始做包子了!")
for i in range(10):
time.sleep(1)
print "做了1个包子!一人一半!"
c.send(i)
c2.send(i)
producer("chao")
A 准备吃包子啦!
B 准备吃包子啦!
开始做包子了!
做了2个包子!
包子[0]来了,被[A]吃了!
包子[0]来了,被[B]吃了!
做了2个包子!
包子[1]来了,被[A]吃了!
包子[1]来了,被[B]吃了!
做了2个包子!
包子[2]来了,被[A]吃了!
包子[2]来了,被[B]吃了!
做了2个包子!
包子[3]来了,被[A]吃了!
包子[3]来了,被[B]吃了!
做了2个包子!
包子[4]来了,被[A]吃了!
包子[4]来了,被[B]吃了!
做了2个包子!
包子[5]来了,被[A]吃了!
包子[5]来了,被[B]吃了!
做了2个包子!
包子[6]来了,被[A]吃了!
包子[6]来了,被[B]吃了!
做了2个包子!
包子[7]来了,被[A]吃了!
包子[7]来了,被[B]吃了!
做了2个包子!
包子[8]来了,被[A]吃了!
包子[8]来了,被[B]吃了!
做了2个包子!
包子[9]来了,被[A]吃了!
包子[9]来了,被[B]吃了!## 标题 ##