暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

「Python」工具人之初学yield(一)

将咖啡转化为程序的工具人 2021-09-09
417

       前段时间,有好心人向工具人推荐了一只网红基金:诺安成长混合,鼓励工具人早日上车,一飞冲天。

       结果工具人发现,好心人不安好心,让工具人高位接盘。

       于是,工具人默默地用刚学会的python 重要特性yield,写了一个许愿池(生成器),每次工具人许愿(send)就会让上证指数上涨100点。

代码如下:

    def wish_index_000001_point_up(price):
    print('初始点位:{:.2f}'.format(price))
    while True:
    change = yield
    price += change
    print('当前点位:{:.2f}'.format(price))




    wish = wish_index_000001_point_up(3400.00)
    next(wish) #初始点位:3400.00
    wish.send(100) #当前点位:3500.00
    wish.send(100) #当前点位:3600.00


    打印结果:
    初始点位:3400.00
    当前点位:3500.00
    当前点位:3600.00


          上面这段代码中,我们只要在函数中增加了yield,就可以把一般函数变成一个生成器,

           其中yield可以理解为一个管道,每次程序运行到yield的时候都会停住,等待输入。第一句next(wish),为了让生成器停在yield的地方,此时,打印出“初始点位:3400.00”

          当我们每次许愿wish.send(100)的时候,就相当于给yield发送了数据,此时上证指数就会收到100的涨幅。然后又回到了yield等待下一次许愿。于是,两次许愿分别打印出:“当前点位:3500.00”,“当前点位:3600.00”。


           那么既然yield被理解为一个管道,那既然可以输入,也可以一定输出,我们调整下许愿的方式:

      def wish_index_000001_point_up(price):
      while True:
      change = yield price
      price += change


      这里我们去掉了while循环之前和内部的两句print,并且在yield后增加了price,然后我们重新许愿:

        wish = wish_index_000001_point_up(3400.00)
        cur_point = next(wish) #初始点位:3400.00
        print('初始点位:{:.2f}'.format(cur_point))
        up = wish.send(100) #当前点位:3500.00
        print( '当前估值:{:.2f}'.format(up))
        up = wish.send(100) #当前点位:3600.00
        print( '当前估值:{:.2f}'.format(up))


              我们关注这句代码:“change = yield price”。该行代码会从右往左执行,初始化生成器时,会首先执行右半边yield price,此时price(我们的入参3400)会通过yield传出到cur_point,然后执行左半边change = yield,即等待输入许愿到change。

              当我们每次许愿wish.send(100)的时候,100将会被传递给change,然后周而复始。

               工具人刚开始很困惑,为什么yield被叫做生成器呢?这个语法糖存在的意义是什么?

          #许愿池
          def wish_index_000001_point_up2(price,times):
          i = 0
          while i < times:
          yield price
          price += 100
          i = i + 1


          for price in wish_index_000001_point_up2(3400.00,5):
          print('当前估值:{:.2f}'.format(price))

          #内幕交易
          for price in [3400.00,3500.00,3600.00,3700.00,3800.00]:
          print('当前估值:{:.2f}'.format(price))

          这里我们看到,使用许愿池5次,和通过“内幕交易”都可以获得如下结果:

            当前估值:3400.00
            当前估值:3500.00
            当前估值:3600.00
            当前估值:3700.00
            当前估值:3800.00

                   但是他们的成本是不一样的,“内幕交易”的数组需要完整的构造,会占用了5个float大小的内存,如果拥有大量“内幕交易”的时候,程序的内存会受到挑战,而我们的“许愿池”则温柔的多,每次只实现一个愿望----细水长流啊!

            当然yield的作用远远不止这些,后续在介绍协程的时候我们会再提到他。

                    好了,今天的介绍就到这里了,如果您和我一样喜欢股论金庆余年,追涨杀跌清贫乐的,请多多转发,多多许愿~


            文章转载自将咖啡转化为程序的工具人,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

            评论