生成器
生成器:
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")