python 3 协程函数
1:把函数的执行结果封装好__iter__和__next__,即得到一个迭代器
2:与return功能类似,都可以返回值,但不同的是,return只能返回一次值,而yield可以返回多次值
3:函数暂停与再继续的状态是由yield保存的
def func(count): print('start') while True: yield count count+=1 g=func(10) print(next(g)) print(next(g)) 使用了yield表达式形式 def eater(name): print('%s 说:我开车啦' %name) while True: food=yield #默认返回为空,实际上为x=yield None print('%s eat %s' %(name,food)) alex_g=eater('alex') print(alex_g) 结果: generator object eater at 0x000000000271B200 alex 说:我开车啦
yield表达式形式要先运行next(),让函数初始化并停在yield,相当于初始化函数,然后再send() ,send会给yield传一个值 ** next()和send() 都是让函数在上次暂停的位置继续运行,next是让函数初始化,send在触发下一次代码的执行时,会给yield赋值
def eater(name): print('%s 说: 我开动啦' %name) food_list=[] while True: food=yield food_list food_list.append(food) # ['骨头','菜汤'] print('%s eat %s ' % (name,food)) alex_g=eater('alex') next(alex_g) #让函数初始化,等同于alex_g.send(None)
# next(alex_g) #让函数初始化,等同于alex_g.send(None) 如果注释这行运行时会报错: TypeError: can't send non-None value to a just-started generator
#第二阶段:给yield传值
print(alex_g.send('骨头')) # #1 先给当前暂停位置的yield传骨头 2 继续往下执行,直到再次碰到yield,然后暂停并且把yield后的返回值当做本次调用的返回值
print(alex_g.send('肉包子'))
print(alex_g.send('菜汤'))
使用装饰器初始化
1 def init(func): 2 def wrapper(*args,**kwargs): 3 res = func(*args,**kwargs) 4 next(res) # 初始化next操作, 5 return res 6 return wrapper 7 @init 8 def eater(name): 9 print('%s 说: 我开动啦' %name) 10 food_list=[] 11 while True: 12 food=yield food_list 13 food_list.append(food) 14 print('%s eat %s ' % (name,food)) 15 16 g = eater('alex') 17 print(g.send('骨头'))