斐波拉契数列(Fibonacci)--用生成器生成数列
斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=1,F(1)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N*)在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用,为此,美国数学会从1963起出版了以《斐波纳契数列季刊》为名的一份数学杂志,用于专门刊载这方面的研究成果。
1 # __Author__Panda-J____ 2 def fib(max): 3 n,a,b=0,0,1 4 while n<max: 5 print(b) 6 a,b=b,a+b#相当于tuple=(b,a+b),a=tuple[0],b=tuple[1] 7 n+=1 8 return 'done' 9 10 11 print(fib(10))
此时的数列全部生成并存在内存中。
如果想使用生成器,可以实现使用一个数生成一个,这也是Generator的一个优点:节约内存,可即时响应。(百万量级的时候尤为明显)
方法为:
print(b)--->yield(b)
完整程序为:
1 # __Author__Panda-J____ 2 def fib(max): 3 n,a,b=0,0,1 4 while n<max: 5 yield (b) 6 a,b=b,a+b#相当于tuple=(b,a+b),a=tuple[0],b=tuple[1] 7 n+=1 8 return 'done' 9 10 11 f=fib(10) 12 print(f.__next__()) 13 print("-------divided------") 14 print(f.__next__()) 15 print(f.__next__()) 16 print("==========") 17 for i in range(5): 18 print(f.__next__())
结果为:
1 -------divided------ 1 2 3 5 ========== 8 13 21 34 55
生成器中只有一个函数就是__next__,跳下一个数。由源代码中可以中途print其他内容可以看出生成器的第二个优点:在数列生成过程中是可以对程序进行暂停和修改的(即并行运算。即协程!!由循环可以看出生成器的第三个特点:__next__函数是一个一个往后推,未使用时会停在上次使用的位置。
如何知道生成器的最大值?
1 # __Author__Panda-J____ 2 def fib(max): 3 n,a,b=0,0,1 4 while n<max: 5 yield (b) 6 a,b=b,a+b#相当于tuple=(b,a+b),a=tuple[0],b=tuple[1] 7 n+=1 8 return 'done' 9 10 11 f=fib(10) 12 n=0 13 while True: 14 try: 15 n+=1 16 x = next(f) 17 print('f:',x) 18 except StopIteration as e: 19 print('Generator return value:',e.value) 20 print(n) 21 break
try为测试方法,next函数只能停在当前值,且只有当前值,只能往后走(next)不可能回到过去(previous)