这篇文章通篇是对PEP-0255的总结,没有遗漏重点。
- “yield”语句只可以出现在函数中。
- 一个包含“yield”语句的函数叫做生成器函数(generator function)。
- 生成器函数被调用时,函数体的代码不会被执行,返回一个生成器-迭代器对象(generator-iterator)。
- 生成器-迭代器对象遵守iterator protocol。
- 每一次生成器-迭代器的
__next__()
方法被调用,生成器函数体中的代码被执行,直到遇到“yield”或“return”语句,或者到达函数体的末尾。 - 如果运行时
yield expression_list
被遇到,函数状态被冻结,expression_list
的值被返回给__next__()
方法的调用者。 - 所谓“冻结”,指的是所有本地状态被保存,包括当前绑定的本地变量,指令指针,以及内部估值栈(internal evaluation stack):足够的信息被保存,以至于下次
__next__()
方法被调用时函数会按照“yield”语句是外部调用进行。 - “yield”语句不允许出现在
try/except
结构的“try”子句中;生成器不能在正在运行时被恢复(resumed)。 - 运行时当
return
被遇到,StopIteration
异常会被提起,表示迭代器被中止;当迭代器寿终正寝时同样的异常也会被提起。 - 如果生成器函数中出现一个未处理的异常,该异常会被传递给调用者,之后对生成器函数进行恢复的尝试都会失败,提起
StopIteration
异常。