协程函数就是函数内部有yield表达式形式的生成器
使用yield表达式:
- 要先运行next(),相当于初始化函数,让函数停在yield
- 然后再运行send(),send会传给yield一个值
def eater(name):
print(f'{name}吃东西')
food_list = []
while True:
food = yield food_list
print(f'{name}吃{food} ')
food_list.append(food)
people = eater('winnie')
print(people)
print(next(people))
print(people.send('米饭'))
print(people.send('菜'))
print(people.send('肉'))
结果:
<generator object eater at 0x0000022F4C26EC48>
winnie吃东西
[]
winnie吃米饭
['米饭']
winnie吃菜
['米饭', '菜']
winnie吃肉
['米饭', '菜', '肉']
使用装饰器进行初始化函数,来替代next()
def outter(func):
def wrapper(*args, **kwargs):
res = func(*args, **kwargs)
next(res)
return res
return wrapper
@outter
def eater(name):
print(f'{name}吃东西')
food_list = []
while True:
food = yield food_list
print(f'{name}吃{food} ')
food_list.append(food)
people = eater('winnie')
print(people)
print(people.send('米饭'))
print(people.send('菜'))
print(people.send('肉'))
结果:
winnie吃东西
<generator object eater at 0x000001AA9FF0EC48>
winnie吃米饭
['米饭']
winnie吃菜
['米饭', '菜']
winnie吃肉
['米饭', '菜', '肉']