这篇文章通篇是对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异常。
转载请注明原文地址: https://ju.6miu.com/read-972208.html