生成器
在 Python 中,使用了 yield 的函数被称为生成器(generator)。
跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。
在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行。
调用一个生成器函数,返回的是一个迭代器对象。
下面是一个所有语言都常见的例子,斐波那契数列:
import sys
from builtins import next, StopIteration
def fibonacci(x):
a, count = 0, 0
b = 1
while True:
if count > x:
return
yield a
a, b = b, a + b
count += 1
f = fibonacci(10)
while True:
try:
print (next(f))
except StopIteration:
sys.exit()
结果
0
1
1
2
3
5
8
13
21
34
55
注意
a, b = b, a + b
与a = b, b = a + b
的区别:
前者是多个变量同时赋值,后者是依次赋值。
例如上面的代码:
def fibonacci(x):
a, count = 0, 0
b = 1
while True:
if count > x:
return
yield a
a, b = b, a + b
count += 1
如果改成
def fibonacci(x):
a, count = 0, 0
b = 1
while True:
if count > x:
return
yield a
a = b
b = a + b
count += 1
那么输出的结果就是
0
1
2
4
8
16
32
64
128
256
512
因为不是同时赋值的话,a
的值已经发生了改变,此时a=1
,所以使用同时赋值可以做到编译优化,避免了不必要变量的定义。