yield的使用

#函数中的生成器: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]吃了!## 标题 ##

猜你喜欢

转载自blog.csdn.net/qq_25611295/article/details/79156946