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)

 

posted @ 2019-01-30 21:26  SKING_Python  阅读(614)  评论(0编辑  收藏  举报