Python进阶:构建一个简单的斐波那契数列函数

python实现斐波那契数列 斐波那契数列是一个非常经典的数列,它的定义是:第0项为0,第1项为1,从第二项开始,每一项都等于前两项之和。这是最直观的方式,但也是效率最低的方式,因为每次计算都需要重复计算前面的项。动态规划的方式将每一步的计算结果存储起来,避免了重复计算。迭代的效率比递归要高,因为它不需要重复计算。它从第2项开始,每次计算出下一项。以上三种方法都可以实现斐波那契数列, 可以根据需要选择适合的方法。斐波那契数列的递归实现和动态规划实现有什么优缺点? 阅读详情

目录

一、写在前面的话:

二、代码实现

2.1 简介

2.2 构思

2.3 代码实现与剖析

2.3.1 def语句、命名规范以及为什么要使用函数

2.3.2 关于形参与实参

2.3.3 文档字符串

2.3.4 简洁的赋值方式:a, b = 0, 1

2.3.5 while循环与print函数

2.3.6 try...except...语句,以及关于多态的简单介绍

2.4 改进方案

2.5 其他的解法(关于递归)


 

一、写在前面的话:

        作为一个可怜的中学生,做什么事情都三分钟热度,因此写下这个强迫自己坚持(作为初三学生也只有周末有空啊),,,

        PS:文章内容属原创,如有雷同纯属偶然,部分引用或转载会说明出处,如侵权请联系删除(邮箱:cdcos@outlook.com/cdcos@qq.com)

print("-"*40)

--------------------------------------------------------------------------------------

二、代码实现

        废话少说,上正文:

        今天的任务就是构建一个简单的函数,这个函数生成一个斐波那契数列。

2.1 简介

        首先介绍一下:

        斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardo Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义:F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*)在现代物理、准晶体结构、化学等领域,斐波那契数列都有直接的应用,为此,美国数学会从 1963 年起出版了以《斐波那契数列季刊》为名的一份数学杂志,用于专门刊载这方面的研究成果。 (引自百度百科)

        简单概括一下:1,1,1+1=2,1+2=3,2+3=5,3+5=8......

2.2 构思

        了解定义之后,首先构思一下如何写代码:定义开始的两项,后面每项等于前两项之和。还要增加一个判断条件,达到某个值就停止,不然停不下来了。

2.3 代码实现与剖析

        上代码: 

def fib(n): #定义函数
    """Print a Fibonacci series up to 'n'.""" #文档字符串
    a, b = 0, 1 #先定义第一,二项
    while a < n: #判断是否满足条件
        print(a, end=" ") #输出第一项
        a, b = b, a + b #计算紧接着的下一项(前两项之和)

if __name__ == "__main__":
    try:
        foo = int(input()) #循环的最大数值由用户决定
        fib(foo) #调用函数
    except: #当输入的不是整数时:
        foo = int(input("Please input an integer!")) #输出提醒
        fib(foo)

这是一个示例,如果有优化建议可以评论或者私信。

下面开始剖析这个函数:

2.3.1 def语句、命名规范以及为什么要使用函数

def fib(n):

这是用来定义一个函数的语句,其中

def Function(parameter) 

用来定义一个函数,Function为函数名。注意函数的命名应符合一定规范(你不符合也可以,但是这会使你的代码缺乏可读性,且会给他人阅读带来不便):

类:

总是使用首字母大写单词串。如MyClass。内部类可以使用额外的前导下划线。

函数&方法:

小写+下划线

注意:混合大小写仅被允许用于这种风格已经占据优势的时候,以便保持向后兼容。

函数和方法的参数(形参):

如果一个函数的参数名称和保留的关键字冲突,通常使用一个后缀下划线

全局变量

对于from M import *导入语句,如果想阻止导入模块内的全局变量可以使用旧有的规范,在全局变量上加一个前导的下划线。

注意:应避免使用全局变量

变量

小写,由下划线连接各个单词。如color = WHITE,this_is_a_variable = 1

大致概括了一下,这方面异议很多,所以并没有一个死的规范;比如你是Windows用户,那你的编程习惯会与Linux用户有很大不同。注意函数(方法)的命名除了上述规范,还应简洁且清晰地体现此函数的作用/功能。

为什么要使用函数?原因仅供参考:1、函数可以使一个大问题分化为多个小问题(化整为零),每个函数负责一个问题,再化零为整,组合起来。作者就尝试过不用函数编程,两个小时不是这里报错就是这里报错,几乎要了我的键盘的命(差点把键盘摔了);

2、使用函数能够避免一段代码的反复重用(即”DRY“,Don't repeat yourself),进而提高代码可读性与简洁程度。


2.3.2 关于形参与实参

“parameter”是参数(更准确地说,形参),用来向函数主体传递值(实参);

对形参和实参做一个简单的区分:形参就相当于一个标签,可以贴在不同的值上,后面的函数方法体可以通过此标签找到对应的值,所以说形参的作用就是传递值,真正传递的是形参所代表的实参。一个形参可以接受不同的值。

如果一头雾水,看这里:有一个停车位,编号为021(一个形参);停车场的主机里有一段程序,用伪代码描述:

def 控制停车位上的灯(停车位编号x):

        if 编号为x停车位有车 == True:

                亮对应编号为x的灯

 形参x将实参"021"传入方法体,方法体根据实参的值执行相应的程序。编号并不只有"021"一个,因此形参x可以对应不同的值(实参)。

参数实际上就是变量,而变量的本质就是占位符,表示这里有个东西,至于是什么则等待一个值(对象)被赋给此变量。或者也可以理解为可以到处乱贴的标签,贴在某个对象(值)上就被赋予了该对象的意义。

如果还没有理解,也并不影响你编程,以后会慢慢理解的。


2.3.3 文档字符串

    """Print a Fibonacci series up to 'n'."""

这是可选的文档字符串(docstrings) ,由三个引号包裹,大概解释了此函数的作用/功能。如果有多行,第一行应该为简单的概括性描述,随后空一行,下接详细描述。多行的文档字符串格式如下:

"""................... #简单描述
 #空一行
.......... #详细描述,可以有多行
...............................
..............................."""

在你的代码中包含文档字符串是一个好的实践,让它成为习惯吧。


2.3.4 简洁的赋值方式:a, b = 0, 1

    a, b = 0, 1

 a, b = 0, 1是Python特有的一种简洁的赋值方式,等效于a = 0, b = 1。


2.3.5 while循环与print函数

    while a < n:
        print(a, end=" ")
        a, b = b, a + b

while引导一个循环,条件是判断斐波那契数列的结尾数字小于某个值(这里的某个值在下面定义)。

print() 函数将打印出圆括号内的值。end = ” “表示打印出的数列以空格隔开,如果不写则会分行打印。加引号或双引号表示打印字符串的内容。

a, b = b, a + b与上面是一样的。


2.3.6 try...except...语句,以及关于多态的简单介绍

if __name__ == "__main__":
    try:
        foo = int(input())
        fib(foo)
    except:
        foo = int(input("Please input an integer!"))
        fib(foo)

try....except...... 语句用于可能出现的错误。这里你无法确保用户输入的是一个整数,所以使用此语句可以避免报错。

try子句后跟可能报错的代码,如果不出错则只执行try子句,如果出错则跳到except子句。

int() 函数用于将某个值的类型转化为整数,如果交给int()函数的值不是整数就会报错。其实这里体现了Python与C语言不同之处,C需要在任一函数声明前限制输入类型,而Python则不需要,判断类型的任务交给后面的函数体执行。这就是所谓的”多态“。其实Python的多态不仅仅体现在这里,还体现在关于类的继承方面,这是后面的内容了。

input() 用于导入由用户决定的值(不单单指数字),括号内用于说明用户需要输入什么:

name = input("Please input your name.")
print("Your name is ", name)

#运行结果:
Please input your name.
Harry
Your name is Harry.

fib()实现了对函数fib的调用,即执行打印斐波那契数列的程序。

if __name__ == "__main__":这里就不赘述了,不然太长了。注意的地方就是有两个等号,Python中一个等号表示赋值(给变量),两个等号才是相等。下面有关于其解释:https://blog.youkuaiyun.com/sgzqc/article/details/124849467?spm=1001.2014.3001.5506


2.4 改进方案

剖析完毕。也许你会发现这里可以改进:此函数不返回值(实际上它返回None)。因此可以这样改进:

def fib(n): #定义函数
    """Return a list containing the Fibonacci series up to 'n'.""" #文档字符串
    result = [] #创建接受返回值的列表
    a, b = 0, 1 #对第一、二项赋值
    while a < n: #条件
        result.append(a) #向列表内加入值
        a, b = b, a + b #计算数列
    return result #返回值


if __name__ == "__main__":
    try:
        foo = int(input()) #确定循环的上限
        fibfoo = fib(foo) #创建一个对象接受函数的返回值
        print(fibfoo) #打印值
    except: #当输入不是整数时:
        foo = int(input("Please input an integer!")) #输出提醒
        fibfoo = fib(foo)
        print(fibfoo)

其中由于此时函数fib返回值,因此找了一个变量(也可以叫对象或者实例)来接受这个值,再用print语句打印出来。

result是一个列表,append是列表的一个方法,我们用点表示法来调用对象result下的一个方法append(result.append())。append方法用于向列表内加入值,且此值的位置在列表的最后(堆栈顶)。result = [] 用来定义一个空列表。列表还可以使用列表解析(列表推导式)。

另一种不使用函数的方案:

try:
    up_num = int(input())
    a, b = 0, 1
    while a < up_num:
        print(a, end=",")
        a, b = b, a + b
except:
    print("Please input an integer!")

2.5 其他的解法(关于递归)

也许你认为到此就结束了。不然。问一问自己是否还有其它解法?如果有,和上面的程序相比哪个运行效率高?

下面解法采用了递归的方式,不懂的可以自己查一查:

def fib(n):
    if n == 0:
        return 0
    elif n == 1:
        return 1
    else:
        return fib(n - 1) + fib(n - 2) #调用程序本身,即递归


if __name__ == "__main__":
    f = fib(10) #调用函数
    print(f)

这个例子不是打印出数列,而是打印出n=10时数列的值。

解析:假设n=3:

1.n=3,fib(3),走return fib(n - 1) + fib(n - 2)分支;

2.fib(3-1),即fib(2),也走else分支,计算fib(2-1)+fib(2-2);

3.fib(2-1)即fib(1),走elif 分支,返回1,fib(2-2)返回0,即fib(3-1)=1+0=1;

4.再计算fib(3-2)=1;

5.fib(3-1)+fib(3-2)=1+1=2,即返回值为2(fib(3)=2)。

 

比较一下两者运行的时间(可以用time模块中的clock()函数,用来计算程序运行时间的。注意Python3.8往后已经没有此函数,可以用

time.process_time()

代替)。可以发现,示例一是0.046875秒,示例二是0.0625秒(循环上限均取10且示例一没有执行except 子句),效率差别很明显了。


 

PS. 示例二的代码引自《跟老齐学Python——从入门到精通》,如有侵权请联系删除,邮箱:cdcos@outlook.com/cdcos@qq.com。

 

Python:实现高效斐波那契数列计算(附完整代码) 记忆化搜索的思路很简单:我们首先创建一个数组来存储计算过的值,当需要计算某个斐波那契数时,我们首先检查它是否已经存在于数组中,如果是,直接返回结果;在Python中,我们可以用递归函数来计算斐波那契数列,但是这样的方法效率很低,因为它会重复计算很多数值。这种方法不需要占用额外的空间,执行速度很快,并且可以计算非常大的斐波那契数。总之,斐波那契数列是一个具有挑战性的计算问题,但是它也是一个非常有趣的问题,同时也有助于我们提高算法设计和编程能力。Python:实现高效斐波那契数列计算(附完整代码) 阅读详情

相关推荐

Python实现斐波那契算法(附完整代码)

斐波那契数列(Fibonacci sequence)是指:1、1、2、3、5、8、13、21、34……从第3项开始,每一项都等于前两项之和。使用Python编写程序计算斐波那契数列,可以采用递归和非递归两种方法实现。以上就是Python实现斐波那契算法的两种方式,其中非递归方法效率更高,建议在实际应用中使用。递归实现斐波那契数列相对简单,但是效率较低,计算较大数列时容易出现时间复杂度过高的情况。非递归方法通过循环迭代来计算斐波那契数列,效率相对于递归方法更高。Python实现斐波那契算法(附完整代码)

DevAstro的博客 1850

斐波那契数列-python实现

斐波那契数列(黄金分割数列)指的是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13,特别指出:第0项是0,第1项是第一个1。从第三项开始,每一项都等于前两项之和。 Python 实现斐波那契数列代码如下: 实现一: 1 def fibonacci(): 2 num = input("Please input your number\n") 3 ...

weixin_30559481的博客 7723

Python程序:输出斐波那契数列

定义一个Python函数fib(n),返回斐波那契数列前n项构成的列表。 def fib(n): fib = [] if n == 1: fib.append(1) elif n == 2: fib.append(1) fib.append(1) else: fib.append(1) ...

howard2005的专栏 1万+

用python实现斐波那契数列的5种简单方法_python实现斐波那契数列

斐波那契数列即著名的兔子数列:1、1、2、3、5、8、13、21、34、……1,1,2,3,5,8,13比如这样一个兔子的对列,第三个数是前两个数之和。让写一个方法,比如让你随机输入一个数字,把它前面的两个数打印出来def fib_num(n):a=0b=1lis=[]while b...

weixin_39946534的博客 6109

可视化大屏系列(5):设备状态面板与数据分析仪表盘

在这篇文章中,我们将重点讨论如何通过智能化手段提升工地设备的管理效率与维护质量。随着智能工地系统的不断发展,设备监控与维护管理变得尤为重要。本篇将从 设备状态实时监控、自动化维护提醒、设备管理与维修记录 三个方面入手,展示如何通过 Vue3 和 ECharts 构建一个智能化的设备管理平台,实时采集和展示设备运行状态、及时生成维护提醒并记录维修历史,以提高设备的使用效率与安全性。我们还将结合实际代码示例,详细讲解如何实现这些功能,帮助你在智能工地项目中实现设备管理的智能化、数字化和自动化。

一名热衷于技术的全栈开发者,专注于前端与后端的全面技术探索。在这里,我将分享我在技术领域的学习与成长,助力更多开发者的进步。 3365

好书分享:Control and Estimation with MATLAB(5th Edition)pdf

基于MATLAB的控制与估计》(第5版)由八章组成,包括控制算法和设计。主要内容包括状态估计和数据平滑、RLS和卡尔曼滤波器状态估计、控制系统设计、自适应控制和PID。书中的概念已经使用MATLAB和Simulink实现。提供了可下载的MATLAB和Simulink文件。适合人群:大学生、研究生、控制类工程研究人员。需要电子版pdf,回复索取。

jixianhu的博客 1511

用Python实现斐波那契数列

了解斐波那契数列的视频 斐波那契数列介绍 斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=1,F(1)=1, F(n)=F...

在路上 1万+

AD9361 Fast Lock实战:Python脚本自动生成Profile寄存器配置(附完整代码)

本文详细介绍了利用Python脚本实现AD9361 Fast Lock Profile寄存器自动化配置的实战方案。通过解析频率合成公式、VCO约束及查表机制,脚本能根据目标频率一键生成完整的16进制寄存器序列,大幅提升射频系统开发中多频点切换的效率和准确性,并支持CSV、JSON、C头文件等多种输出格式,便于与FPGA/嵌入式系统集成。

weixin_29194693的博客 475

编写一个生成器函数,能够生成斐波那契数列

用Python语言编写一个生成器函数,能够生成斐波那契数列 斐波那契数列 首先介绍下什么是斐波那契数列: 斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……这个数列从第3项开始,每一项都等于前...

编写一个生成器函数,能够生成斐波那契数列 6969

PointMLP实战:5分钟用PyTorch搭建点云分类模型(附GitHub代码)

本文提供了基于ICLR 2022论文PointMLP的点云分类模型实战教程。通过PyTorch框架,详细介绍了从环境搭建、数据预处理、模型架构解析到训练推理的全流程,并分享了性能调优技巧。该模型利用残差MLP模块构建,结构清晰高效,适合开发者快速上手并应用于实际点云处理项目。

r2s3t4的博客 215

kali攻防第2章 内网称霸之渗透安卓系统

Kali内网称霸之渗透安卓系统   准备工具   1、准备一部实体android手机 2、使用KALI系统     要用到强大的msf工具(metasplot)   流程步骤 1、启动msf命令是msfconsole 2、在安卓手机上安装一个自己生成的apk木马程序 3、利用msf工具来远程连接Android系统   1)启动msf(注意这里是链接msf就行了不需要进

安全参透之旅 1万+

Python递归算法解决斐波那契数列

** Python递归算法解决斐波那契数列 ** 斐波那契数列指的是这样一个数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368… 这个数列从第3项开始,每一项都等于前两项之和。 递归算法 定义:就是一个函数直接或间接调用自身的一种方法,他...

weixin_43734271的博客 1万+

matlab 计算InSAR干涉相位图的残差点

在理想的情况下,相位场是连续的,图像内沿着任何一条封闭曲线的积分应该为零。这样的连续场称为无旋场,反之为有旋场。但在实际测量过程中,由于噪声、欠采样和系统误差等因素的影响,得到的 InSAR 干涉相位条纹图中往往会出现不连续的相位点,即残差点

点云侠的博客 268

python编写函数求斐波那契数列的某一项_用python函数写斐波那契数列

斐波那契数列,又称黄金分割数列、因数学家列昂纳多·斐波那契以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以递归的方法定义。对于学习编程语言的小伙伴们来说,斐波那契数列将是一个最经典的函数之一,今天用Python来给大家讲讲这个经典的函数怎么简单粗暴的实现。实现之前呢,先给大家介绍一下斐波那契数列的原理,原题是一...

weixin_39524834的博客 2353

购物车智能检测系统:YOLO26 + PyQt5 毕设实现

YOLO26 + PyQt5 完成购物车商品检测系统:标注数据集(OpenImages 筛选 + 自制 500 张),训练 100 epoch 得到 mAP50 约 0.89,集成商品定价后输出总价。建议先用 OpenImages 预训练权重在自制数据上调优(冻住 backbone 前 50 epoch),等 loss 稳定后再解冻全量训练。

m0_64661770的博客 56

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

用python函数写斐波那契数列的函数_python—函数进阶-斐波那契数列

上次说到生成器的调用next(),这样很不方便,需要手动调,我们一般是循环着调,while ,for都可以a = (i for i in range(5))for i in a:print(i)01234 # 执行结果#和手动调的区别是没了的话就会自动终止循环。就跳出来了#换成whilea = (i for i in range(5))while True:next(a)01234Traceb...

weixin_33111267的博客 4542

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

python写斐波那契数列

# 斐波那契数列 # 1. 斐波那契数列就是一个数,总是前两个数之和,比如0,1,1,2,3,5,8,13 # 2. 使用for 循环和range函数编写一个程序,计算有10个数字的斐波那契数列 # 3. 改进程序,要求用户输入一个数字,可以生成用户需要长度的斐波那契数列 # step1 nlist = [] for i in range(10): if len(nlist) &lt...

zhang_fei_fresh的博客 3216

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

python利用递归函数实现斐波那契数列_利用Python实现斐波那契数列的方法实例

今天我们来使用Python实现递归算法求指定位数的斐波那契数列首先我们得知道斐波那契数列是什么?斐波那契数列又叫兔子数列斐波那契数列就是一个数列从第三项开始第三项的值是第一项和第二项的和依次类推其次我们再来看递归算法是什么?递归就是如果函数(子程序)包含了对其自身的调用,该函数就是递归的话不多说上案例:第一种方法:不使用递归算法#首先定义一个新的列表来储存最后的结果new_list = []# 然...

weixin_39797693的博客 2197

利用python实现斐波那契数列

斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家莱昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”。斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13,特别指出:第0项是0,第1项是第一个1。从第三项开始,每一项都等于前两项之和。 下面介绍两种通过python实现斐波那契数列的方法。 1、递归法: def fs(n): assert n >= 0, "n > 0"

CZ-001的博客 2万+

斐波那契数列 python 列表_Python_斐波那契数列

斐波那契数列斐波那契数列有称为黄金分割数列。在数学上,斐波那契数列可以以递归的方法定义:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n>=2,n属于正整数)。简单的归结斐波那契数列为:第1个数值为0,第2个数值为1,之后的每个数值是位于它之前的两个数值之和。代码实现每隔一秒打印一个“斐波那契”数列数字,并且将数列保存到指定的文件中。1 #!/user/bin/env pyth...

weixin_39660408的博客 1390

python输出斐波那契数列_详解python输出斐波那契数列

这篇文章详解python输出斐波那契数列def recur_fibo(n):"""递归函数输出斐波那契数列"""if n

weixin_39870155的博客 2119

用python写一个斐波那契数列

def fei(n): a=0 b=1 n=0 while n<10: print(b) a,b=b,a+b n=n+1 fei(10) 斐波那契数列是当前数加上前一个数,得到下一个数字。所以我们需要a和b两个变量,b指向当前数,a指向前一个数。然后设置n,用来规定输出数列的长度。 这里需要注意的点有一个,那就是a,b=b,a+b a, b

一纸春秋的博客 2003
下一篇: 以简洁且简单的方式安装Kali虚拟机(VirtualBox / VMware Work Station 17),以及安装后的简单配置
Fallen Flowers
博客等级 码龄4年 8粉丝 3原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值