Python yield v/s return
Python yield 和 return 最大的区别在于栈的保留与否。
在 yield 切出控制权后,解释器依然保留函数的栈,直到下次 next() 调用重新换入控制权。在有 yield 的函数中结束执行需要用 return
:这个关键词不带返回值时表示我执行结束了,并且不关心任何返回值(PEP 255)。PEP 289 中引入了列表推导,形如 (x for x in xs),它返回的就是 generator。另外可以知道的小窍门是 gen.send() 方法将数据传入 yield;以及 Python3 中 yield from 可以将 yield 委托给另外一个 generator。
生成器给我们带来的最大的好处是简化代码,让一小块代码专注于怎么生成数据;另外一个好处是性能提升 - 不用把大把数据塞入内存。
衍生思考:大量数据, 管道函数,并发,都很适合使用 generator,本质上它就是 SICP 中提到的 lazy evaluation。