一、什么是斐波那契数列
数学中有个著名的斐波那契数列(Fibonacci sequence),又称黄金分割数列 ,因数学家莱昂纳多·斐波那契(Leonardo 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*)。
简单概括,斐波那契数列的第n项等于第(n-1)和第(n-2)项,即前两项和,其中n>2
要求:数列中第一个数为1,第二个数为1,其后的每一个数都可由前两个数相加得到:
例子:1, 1, 2, 3, 5, 8, 13, 21, 34, ...
二、关于Python生成器
1.什么是生成器
在Python中,一边循环一边计算的机制,称为生成器:generator。
生成器是一种特殊的迭代器,它允许你按需生成值,而不是一次性生成所有值。这使得生成器非常适合处理大数据集或无限序列。
2.为什么要使用生成器
列表所有数据都在内存中,如果有海量数据的话将会非常耗内存。
例如通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。
如果列表元素按照某种算法推算出来,那我们就可以在循环的过程中不断推算出后续的元素,这样就不必创建完整的list,从而节省大量的空间。
生成器使用了yield语句,将返回值给调用者,而不是通过return语句。它允许函数在每次调用时产生一个值,并在下一次调用时从上次停止的地方继续执行。这样的机制避免了一次性加载所有数据到内存中,从而提高了效率。
例子:
通过列表推导式,生成器推导式创建生成器,比较使用原来的列表方式生成数据集和使用生成器生成数据集所需要的运行时间
import memory_profiler as mem
# nums = [1, 2, 3, 4, 5]
# print([i*i for i in nums])
nums = list(range(10000000))
print('运算前内存:', mem.memory_usage())
# 列表
# square_nums = [n * n for n in nums]
# 生成器
square_nums = (n * n for n in nums)
print('运算后内存:', mem.memory_usage())