1 2 3

生成器


生成器:
1.如果一个函数调用时返回的是一个迭代器,那这个函数就叫做生成器(generator)
2.如果函数中包含yield语法,那这个函数就会变成生成器

作用:
这个yield的主要作用,可以使函数中断,并保持中断状态,
中断后,代码可以继续往下执行,过一段时间还可以再次重新调用这个函数,从上次yield的下一句开始执行

#例子1
def Foo(amount):
    while amount >0:
        amount -= 1
        yield 1    #函数中有yield语法,函数就变成了生成器
        print("握草,败家仔又来取钱!")

ATM = Foo(3)      #默认生成器只能在创建时传一次参数(不过可以通过send()方法来赋值传参)
# print(ATM)      #生成器在调用时不会直接执行 <generator object Foo at 0x000000000068BFC0>

print("本次提现:%s万元\n"%ATM.__next__())    #需要通过__next__()方法来依次调用
print("本次提现:%s万元\n"%ATM.__next__())
print("本次提现:%s万元\n"%ATM.__next__())

#例子2
#使用yield实现单线程中的异步并发效果
'''
yield方法即可以赋值也可以有返回值
1. variable = yield    这样是给variable赋值
2. yield 100           这样是返回值(返回值为100)
'''
import time
def consumer(name):
    print("%s 准备吃包粽子了"%name)
    while True:
        zongzi = yield  #send(i)会给yield赋值,然后yield在赋值给zongzi这个变量
        print("粽子[%s]来了,被[%s]吃了!"%(zongzi ,name))

def producer(name):
    a = consumer('A')
    b = consumer('B')
    a.__next__()
    b.__next__()
    print("%s准备做粽子了!"%name)
    for i in range(10):
        time.sleep(1)
        print("做了2个粽子!")
        a.send("最大的粽子")   #给yield赋值
        b.send(i)   #给yield赋值

producer("eric")

 

posted @ 2017-05-19 09:53  矜持小蝌蚪  阅读(205)  评论(0编辑  收藏  举报
levels of contents