前言
生成器很容易实现,但却不容易理解。生成器也可用于创建迭代器,但生成器可以用于一次返回一个可迭代的集合中一个元素。现在来看一个例子:
def yrange(n): i = 0 while i < n: yield i i += 1
每次执行 yield 语句时,函数都会生成一个新值。
“生成器”这个词被混淆地用来表示生成的函数和它生成的内容。
当调用生成器函数时,它甚至没有开始执行该函数就返回一个生成器对象。 当第一次调用 next()
方法时,函数开始执行直到它到达 yield 语句。 产生的值由下一次调用返回。
以下示例演示了 yield 和对生成器对象上的 next 方法的调用之间的相互作用。
>>> def foo(): ... print("begin") ... for i in range(3): ... print("before yield", i) ... yield i ... print("after yield", i) ... print("end") ... >>> f = foo() >>> next(f) begin before yield 0 0 >>> next(f) after yield 0 before yield 1 1 >>> next(f) after yield 1 before yield 2 2 >>> next(f) after yield 2 end Traceback (most recent call last): File "<pyshell#13>", line 1, in <module> next(f) StopIteration >>>
生成器也是迭代器
生成器也是迭代器,支持使用 for 循环。当使用 for
语句开始对一组项目进行迭代时,即运行生成器。一旦生成器的函数代码到达 yield
语句,生成器就会将其执行交还给 for
循环,从集合中返回一个