码迷,mamicode.com
首页 > 其他好文 > 详细

协程函数

时间:2017-04-12 02:08:04      阅读:184      评论:0      收藏:0      [点我收藏+]

标签:list   地方   print   就会   --   pen   生成   需要   协程   

1、协程函数吃包子简洁案例

  下面代码中需要注意的是,yield的位置和作用,仔细看运行原理

def eater(name):
    print(‘%s start to eat food‘ %name)#第一个print
    while True:
        food=yield
        print(‘%s get %s ,to start eat‘%(name,food))#第二个print
    print(‘done‘)
e=eater(‘钢蛋‘)#e是生成器
print(e)#打印生成器的内存地址
print(next(e))#next触发函数执行,执行第一个print后碰到yield是停止,但yield后面没有值,所以返回None
# >>钢蛋 start to eat food
# >>None
print(next(e))#next触发函数执行,再上一个yield处开始运行,打印第二个print-->while true->又碰到yield后停止,但yield后面没有值,所以返回None
# >>钢蛋 get None ,to start eat
# >>None

  既然yield以表达式的形式出现了,我们就不得不想到赋值,那要赋值就得先传值,这里就会用到g.send(value),g指生成器,g.send(value)作用就和next(g)差不多一样,都是会触发函数进行运行一次,不一样的是,g.send(value)会把参数value传给yield再由yield赋值给等式另一边的对象,这个参数不会作为yield的返回值

def eater(name):
    print(‘%s start to eat food‘ %name)#第一个print
    while True:
        food=yield
        print(‘%s get %s ,to start eat‘%(name,food))#第二个print
    print(‘done‘)
e=eater(‘钢蛋‘)#e是生成器
next(e)#next触发执行一次打印第一个print后碰到yield停止,这里没有打印
# >>钢蛋 start to eat food
e.send(‘包子‘)#send和next一样都会触发函数运行,碰到yield后停止得到一个返回值,不一样的地方就是send会把自己的参数交给当前暂停的yield,再由yield交给他赋值给的对象,这里是food,然后打印第二个print在经过whiletrue碰到yield停止,这里没有打印e.send(‘包子‘)的返回值
# >>钢蛋 get 包子 ,to start eat
print(e.send(‘包子‘))#加上上面的运行结果后,还要返回None,因为yield后面依旧没有值,所以send执行完后他传入的参数也没了
# >>钢蛋 get 包子 ,to start eat
# >>None

  吃包子欢乐行,yield的返回值就是包子单,注意运行原理,始终围绕yield走

def eater(name):
    print(‘%s start to eat food‘ %name)#第一个print
    food_list=[]
    while True:
        food=yield food_list
        print(‘%s get %s ,to start eat‘%(name,food))#第二个print
        food_list.append(food)
    print(‘done‘)
e=eater(‘钢蛋‘)#e是生成器
print(next(e))
print(e.send(‘包子‘))
print(e.send(‘韭菜包子‘))
print(e.send(‘榴莲包子‘))

#运行结果如下:
# 钢蛋 start to eat food
# []
# 钢蛋 get 包子 ,to start eat
# [‘包子‘]
# 钢蛋 get 韭菜包子 ,to start eat
# [‘包子‘, ‘韭菜包子‘]
# 钢蛋 get 榴莲包子 ,to start eat
# [‘包子‘, ‘韭菜包子‘, ‘榴莲包子‘]

  

协程函数

标签:list   地方   print   就会   --   pen   生成   需要   协程   

原文地址:http://www.cnblogs.com/wuyongqiang/p/6697009.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!