首先,用代码写一个简单的斐波那契数列:
def a(n):
b,num1,num2 = 0,1
while b <= n:
num = num1
num1,num2 = num2,num1 + num2
b += 1
print(num)
a = a(5)
运行结果:
但是,直接在函数中用 print 打印数字会导致该函数可复用性较差,因为函数返回值None,其他函数无法获得该函数生成的数列。要提高函数的可复用性,最好不要直接打印出数列,而是返回一个 List。
def a(n):
b,num1,num2 = 0,0,1
list1 = []
while b <= n:
num = num1
num1,num2 = num2,num1 + num2
list1.append(num)
b += 1
return list1
a = a(5)
print(a)
for i in a:
print(i)
结果:
可以看到,返回一个列表后,可以遍历列表操作,但是,该函数在运行中占用的内存会随着参数 n 的增大而增大,如果要控制内存占用,最好不要用 List来保存中间结果,而是通过 iterable 对象来迭代。
def a(n):
b,num1,num2 = 0,0,1
while b <= n:
num = num1
num1,num2 = num2,num1 + num2
b += 1
yield num
a = a(5)
print(a)
for i in a:
print(i)
结果:
这里返回的就是一个生成器对象,对它同样可以遍历操作,也就是说,yield 的作用就是把一个函数变成一个 generator(生成器),带有 yield 的函数不再是一个普通函数,Python 解释器会将其视为一个 generator,调用 a(5) 不会执行a()函数,而是返回一个 iterable 对象!在 for 循环执行时,每次循环都会执行 a() 函数内部的代码,执行到 yield 时,a()函数就返回一个迭代值,下次迭代时,代码从 yield 的下一条语句继续执行,而函数的本地变量看起来和上次中断执行前是完全一样的,于是函数继续执行,直到再次遇到 yield。
这样就节省了大量空间,且同样能拿到所需要的结果。