• 协程函数


    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
    # ['包子', '韭菜包子', '榴莲包子']
    

      

     2.总结yield的功能:

        1.相当于把__iter__和__next__方法封装到函数内部
    2.与return比,return只能返回一次,而yield能返回多次
    3.函数暂停以及继续运行的状态是通过yield保存的

    3.
    e.send与next(e)的区别
      1.如果函数内yield是表达式形式,必须先next(e)
      2.二者的共同之处是都可以让函数在上次暂停的位置继续运行
    不一样的地方在于send 在出发下一次代码的执行时,会顺便给yield传一个值
    123=yield=food

     

    def eater(name):
        print('%s start to eat' % name)
        while True:
            food = yield 123         #返回值
            print('%s eat %s' %(name,food))
    
    e = eater('zhejiangF4')
    next(e)
    #e.send('123')
    print(e.send('123'))
    
    
    zhejiangF4 start to eat
    zhejiangF4 eat 123
    123
    

      

      

  • 相关阅读:
    信息安全系统设计基础第八周期中复习总结
    layui下各种富文本的冲突情况
    TP3.2+find_set_in 以及 find_set_in和like的区别
    tp5+linux+apache php7.1.30环境下,上传图片报错:mkdir():permission denied
    一次基于老古董thinkPHP3.1的修改尝试
    微信网页开发 thinkphp5.0的try-catch和重定向
    CentOS 7.2下服务器配置(linux+apache+php+mysql)
    微信小程序踩坑(不定时更新)
    PHP 定时自动执行代码
    PHP TP5 文章评论+积分+签到
  • 原文地址:https://www.cnblogs.com/jiangshitong/p/6699095.html
Copyright © 2020-2023  润新知