先看一个例子:
用python实现斐波那契数列(斐波那契数列):
def fac1(n):
result=[]
a,b = 0,1
while b<n:
result.append(b)
a,b = b,a+b
return result
for i,f in enumerate(fac1(10)):
print (i,f)
0 1
1 1
2 2
3 3
4 5
5 8
下面我们使用生成器:
def fac2(n):
a,b = 1,1
while a<n:
yield a
a,b = b,a+b
for i,f in enumerate(fac2(10)):
print (i,f)
0 1
1 1
2 2
3 3
4 5
5 8
看第二种方法代码是不是简洁很多,这就是yield关键字的魅力。
如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个生成器函数,打印看一下。
print(fac2(10))
<generator object fac2 at 0x000001D230E3C660>
生成器函数和普通函数的执行流程非常不一样:
- 函数是顺序执行,遇到return语句或者最后一行函数语句就返回。
- 而变成生成器的函数,只会相应迭代操作时才运行,一般都是配合for使用(也有配合sum(),list())
- 在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。