[python]yield使用的最佳实践[1]

http://www.dabeaz.com/coroutines/Coroutines.pdf

准备

  • python: 2.7.12
  • os: mac os

结论 [使用场景]

  • 迭代生成数据(生产者)
  • 接收数据(消费者)
  • 中断(协作式的任务)

任何脱离以上三个场景的使用yield,请使用其它方法处理,yield是很好用,但不至于到处都可以使用的地步

协程和生成器-Coroutines and Generators

  • 在python2.5 开始 ,生成器就已经加入一些新的特性,比如协程(PEP-342)(啥,不了解PEP,自己查一下)
  • 最为知名的,一个新的叫做send()的方法
  • 大部分的文档,或者书对于这些特性,都很少提及实际的应用场景

使用协程和生成器

生成器

先来看一段最简单的代码

  • 和直接返回值不一样的是,每次都返回其中的某一个
  • 所以从技术层面来讲,这个在某些场景可以有for-loop的功效
  • 虽然使用起来都是def 为开始的关键字,不过生成器的类型可等同于func ,我们对比一下就知道了

一个实际的例子

  • python版本的 unix ‘head -f ‘

  • 将生成器当成pipelines 使用

在这里,while True就失去了原来一直循环的作用,这里只对有的值做处理

将yield做为表达式使用

直接上代码,讲一下当作消费者使用时的实际场景

这里的corotine 的装饰器,是为了方便的激活coroutine函数,try except ,定义当coroutine终止的时候异常

点赞