python3 yield表达式形式应用
python3 yield表达式形式应用
我们已知:
生成器函数:函数体内包含有yield关键字,该函数执行的结果是生成器
yield的功能:
1.与return类似,都可以返回值,但不一样的地方在于yield返回多次值,而return只能返回一次值
2.为函数封装好了__iter__和__next__方法,把函数的执行结果做成了迭代器
3.遵循迭代器的取值方式obj.__next__(),触发的函数的执行,函数暂停与再继续的状态都是由yield保存的
yield的表达式:
x = yield 将yield的值传给x,那么yield的值哪里来?用send( )传入
send的效果:
1:先从为暂停位置的那个yield传一个值,然后yield会把值赋值x
2:与next的功能一样
1 def init(func): # 此装饰器给foo()函数做初始化,next(g)停留在yield。 2 def wrapper(*args,**kwargs): 3 g=func(*args,**kwargs) 4 next(g) 5 return g 6 return wrapper 7 8 @init #foo=init(foo) 9 def foo(): 10 print('starting') 11 while True: 12 x=yield None#return 1 13 print('value : ',x) 14 15 g=foo() #wrapper() 16 17 g.send(2) # 然后用g.send(2)传值给yield,执行顺序为:send()传值给yield,yield传值给x,然后执行next()的功能。
练习: 食客吃饭上菜
1 def init(func): 2 def wrapper(*args, **kwargs): 3 g = func(*args,**kwargs) 4 next(g) 5 return g 6 return wrapper 7 8 @init 9 def eater(name): 10 print('%s start to eat' %name) 11 food_list= [] 12 while True: 13 food=yield food_list 14 food_list.append(food) 15 print('%s start to eat %s' %(name, food)) 16 17 def make_food(people,n): 18 for i in range(n): 19 people.send('food%s' %i) 20 21 e = eater('alex') 22 make_food(e,5)