Python Tricks Part 6: Generators
生成器是 Python 中一种强大的特性,其通常被介绍为一种定义新型迭代模式的便捷方式。 但生成器从根本上改变了整个函数执行的模式,本篇文章重点关注:生成器、生成器委托、基于生成器的协程,以及生成器的其他内部机制。 Generators and yield 如果一个函数使用 yield 关键字,这定义了一个生成器。 生成器的主要用户是生成用于迭代的值。 例如: def countdown(n): print("Counting down from", n) while n > 0: yield n n -= 1 # Example use for x in countdown(n): print("T-minus", x) 如果调用该函数则不会开始执行: c = countdown(10) # <generator object countdown at 0x106faa260> 相反,会创建一个生成器对象。 该生成器对象只有在你迭代它的时候才会开始执行,使用的一种方式是调用 next()。 例如: next(c) # Counting down from 10 # 10 next(c) # 9 当调用 next() 时,生成器函数会执行语句直到遇到 yield 语句。 yield 语句会返回一个结果,此时函数的执行被挂起,直到再次调用 next()。 当其暂停的时候,函数会保留所有的本地变量和执行环境。 恢复执行时,程序会从 yield 之后的语句继续运行。 next() 是调用生成器上 __next__() 方法的简写形式。 例如,你可以这样: c.__next__() # 8 c.__next__() # 7 通常不会在生成器直接使用 next(),而是使用 for 或其他一些语句: ...