Logo
Section 1 / 7

生成器

本课程介绍生成器及其在 Python 中的使用方法。

导入

生成器

本课程介绍生成器及其在 Python 中的使用方法。

生成器

如果你阅读了前一章,就会知道迭代器是经常与 for 循环一起使用的对象。换句话说,迭代器是实现了迭代协议的对象。Python 中的生成器是一种实现迭代器的便捷方式。与类不同,生成器是一个函数,每次使用 yield 关键字时都会返回一个值。下面是一个用于计算两个数字之间数值的生成器示例:

1def myrange(a, b): 2 while a < b: 3 yield a 4 a += 1 5a = myrange(2, 4) # 调用生成器函数,返回一个对象 6print(next(a)) # 使用 next() 迭代获取元素 7print(next(a))

和迭代器一样,生成器也可以与 for 循环一起使用:

1def myrange(a, b): 2 while a < b: 3 yield a 4 a += 1 5for value in myrange(1, 4): 6 print(value)

在底层,生成器的行为类似于迭代器。如下面的例子所示,取消注释第 9 行将导致错误:

为什么会出错?

因为在第 6 行,范围是从 1 到 3,所以再尝试生成下一个数值时就会出错。

1def myrange(a, b): 2 while a < b: 3 yield a 4 a += 1 5 6seq = myrange(1, 3) 7print(next(seq)) 8print(next(seq)) 9# next(seq)

生成器有趣的地方在于 yield 关键字。yield 关键字的工作方式类似于 return,但与 return 不同的是,它允许函数在之后恢复执行。换句话说,每当需要生成器的下一个值时,Python 会唤醒该函数,并从 yield 语句处继续执行,就好像函数从未退出过一样。

生成器函数内部可以调用其他函数。例如,通常会使用 range 函数来遍历一组数字:

1def squares(n): 2 for value in range(n): 3 yield value * value 4 5sqr = squares(8) 6print(next(sqr)) 7print(next(sqr)) 8print(next(sqr))

现在,让我们通过一些练习来巩固你对生成器概念的理解。

迭代器

挑战 1:从 1 到 n 生成奇数