关键字yield与一个概念相关,即生成器。

  • 生成器是一个不断产生值的函数;
  • 包含yield语句的函数是一个生成器;
  • 生成器每次产生一个值(yield语句),函数被冻结,被唤醒后再产生一个值。

生成器一般与循环结构搭配使用,如下面的例子。

生成器写法:

1
2
3
4
5
6
7
8
>>> def gen(n):
... for i in range(n):
... yield i**2
...
>>> for i in gen(5):
... print(i, end=' ')
...
0 1 4 9 16

普通写法:

1
2
3
4
5
6
7
8
>>> def square(n):
... ls = [i**2 for i in range(n)]
... return ls
...
>>> for i in square(5):
... print(i, end=' ')
...
0 1 4 9 16

生成器写法和普通写法看起来效果是一样的,那有什么区别?

  • 生成器每次只计算输出一个值,普通写法一次计算出所有值并返回。

生成器相比一次列出所有内容的优势?

  • 更节省存储空间;
  • 响应更迅速;
  • 使用更灵活

上述例子中,我们n比较小,只有5。

若n=1M,10M甚至100M,普通写法将花费大量的时间和空间,但生成器写法每次只要计算1个元素的时间和空间。