关于yield from的深度剖析一

       关于yield from的用处,相信很多人都是从《fluent python》那本书里学习来的,作者也是,那本书里会告诉你,yield from用处在于它

        1)可以让我们更方便得迭代访问可迭代对象。

       for i in “AB”:

           yield i

       等价于 yield from “AB”

       for i in iterables:

           for j in i:

               yield j

       等价于

       for i in iterables:

           yield from i

       2)可以实现一个委托生成器(带yield from的生成器),委托生成器在它的调用者和子生成器之间充当一个管道/桥梁。调用者以传值的方式(send/throw)调用委托生成器,委托生成器拿到值之后再以传值的方式(send/throw)调用子生成器,子生成器拿到值之后执行一些逻辑,yield一个值给委托生成器,委托生成器拿到值之后再yield给调用者。

       委托生成器这种说法只是在讲一个调用返回链条的双向数据流动的逻辑,一个简单的类比:

       def A(n):

          return B(n)

       def B(n):

          return C(n)

       def C(n):

          return n

       A(0)

       包含yield from语句的委托生成器就像上面的B,A就像调用者,C就像子生成器。fluent python的作者并没有真正领会yield from的精髓,他是流于表面了。yield from并不是被设计用来充当一个数据的流动通道,那只是它的表征而非实质,以我的理解yield from设计初衷是用于把一些基础的功能(子生成器)组合起来以实现更复杂的功能(生成器),就像是堆积木一样,yield from表达式的内部逻辑是以一个循环来调用尽子生成器,以捕获一个StopIteration异常为结束,并以StopIteration的value属性为表达式的结果。

        yield from表达式一出来,刚开始也令我不那么喜欢,因为有点过于抽象了,一个简单的表达式,它内部却是干了很多的事情,太抽象的东西就会让你心里没个底,所幸的是PEP文档里给出了它的一个等价代码,大家要好好看看,看明白了就不是囫囵吞枣了。

  • 15
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

__空无一人__

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值