来源引用网络知识与某站曹老师视频相互结合学习记录仅供参考Python 基础知识三、函数函数是执行特定任务的一段代码程序通过将一段代码定义成函数并为该函数指定一个函数名这样即可在需要的时候多次调用这段代码例如之前使用的 range() 函数就是系统内置的函数功能是通过传入参数返回特定范围的数字序列函数名是 range当需要使用的时候可以直接调用函数名可反复多次使用函数的定义函数的定义语法def 函数名(形参列表):函数体由零条或多条可执行语句组成的函数return 返回值函数名要符合标识符定义取名的时候要有意义看名知义形参列表是定义该函数可以接受的参数可以为空多个参数之间使用逗号隔开调用函数的地方传入对应的参数值return 返回值返回函数的执行结果若没有返回值可省略# 定义一个最基础的函数例如 say_helloworld def say_helloworld(): print(Hello World!) # 调用函数直接使用函数名 say_helloworld say_helloworld() # 再次调用 say_helloworld 函数 say_helloworld() 运行结果 Hello World! Hello World!函数的参数函数形参部分可以不定义参数直接空括号即可若有多个参数可以使用 ”,“ 逗号隔开在调用的时候传入的就是实际参数按照形参定义顺序传入即可# 定义一个加法函数 def add(a, b): result a b print(f{a} {b} {result}) # 调用函数 add(1, 2) add(3, 4) add(5, 6) 运行结果 1 2 3 3 4 7 5 6 11关键字(keyword)参数上面的实例中是位置参数在调用的时候必须严格按照定义函数时指定的顺序来传入参数值若根据参数名来传入参数值则无需蹲守定义形参的顺序这种方式被称为关键字(keyword)参数注意点在使用关键字参数的时候顺序可以随便换部分使用关键字参数部分使用位置参数混合使用的时候关键字参数必须位于位置参数之后否则会报错# 定义一个加法函数 def add(a, b): result a b print(f{a} {b} {result}) # 根据关键字参数来传入数值 add(a1, b2) # 在使用关键字参数的时候指定参数名后顺序可以随意更换 add(b2, a3) # 混合使用部分使用位置参数部分使用关键字参数 add(4, b5) # 在混用时关键字参数务必要在位置参数之后否则报错 # add(b6, 7)参数默认值在某些情况下程序需要在定义函数时为一个或多个形参指定默认值这样在调用函数时就可以省略为该形参传入参数值而是直接使用该形参的默认值语法格式形参名默认值# 定义一个加法函数 def say(name张三, msg法外狂徒): print(f{name} 的称号是{msg}) # 全部使用默认参数 say() # 部分使用默认参数 say(李四) # 都不使用默认参数 say(王二, 客栈王小二弟弟) # name使用默认参数值msg则需要使用关键字参数 say(msg西行记大师) 运行结果 张三 的称号是法外狂徒 李四 的称号是法外狂徒 王二 的称号是客栈王小二弟弟 张三 的称号是西行记大师注意点可以全部使用默认参数可以部分使用默认参数可以全部不使用默认参数假如前面参数使用默认参数后面的参数需要使用关键字参数Python 要求将带有默认值的参数定义放在形参列表的最后函数的返回值函数执行完毕可以返回数据给方法的调用者可以通过 return 关键字返回多个数据# 定义一个加法函数 def add(a, b): result a b # 通过return关键字把ab的结果返回给函数的调用者 return result # 定义变量r接收函数的返回值 r add(1, 2) print(f调用add(1,2)的返回值结果是{r}) # 定义变量r2接收函数的返回值 r2 add(3, 4) print(f调用add(3,4)的返回值结果是{r2}) 运行结果 调用add(1,2)的返回值结果是3 调用add(3,4)的返回值结果是7如果程序需要多个返回值则即可将多个值包装成列表之后返回也可直接返回多个值如果 Python 函数直接返回多个值Python 会自动将多个返回值封装成元组如果函数没有使用 return 语句返回数据则函数返回的是 None 值None 是空的意思# 定义一个最基础的函数例如 say_helloworld def say_helloworld(): print(Hello World!) # 调用函数 result say_helloworld() print(f返回的结果是{result}返回的类型是{type(result)}) 运行结果 Hello World! 返回的结果是None返回的类型是class NoneType这个 None 值有哪些作用呢1、可以用于 if 判断2、可以用于声明无初始化内容的变量# 定义一个最基础的函数例如 say_helloworld def check_user(username, password): if username test01 and password 123456: return success else: return None result check_user(test01, 123456789) print(f返回的结果是{result}) # 1可以用于if判断 # if result None: # 可以省略直接使用not if not result: print(登录失败) # 2可以用于声明无初始化内容的变量 usernames None print(usernames) 运行结果 返回的结果是None 登录失败 None函数的说明文档使用 (三个引号)备注说明然后在调用函数的地方鼠标移动上去就能看到函数的说明提供代码的可读性def add(a, b): 两数相加函数 :param a: 两数相加数中的a :param b: 两数相加数中的a :return: 两数相加的结果 return a b add(1, 2)变量作用域在程序中定义一个变量时这个变量是有作用范围的变量的作用范围被称为它的作用域根据定义变量的位置变量分为两种局部变量在函数中定义的变量包括参数都被称为局部变量全局变量在函数外面、全局范围内定义的变量被称为全局变量1、局部变量def test(): name abc123 # 在方法里面定义局部变量name print(name) test() # 局部变量外面无法使用 print(name)2、全局变量name2 test01 def name_test(): name abc123 # 在方法里面定义局部变量name print(name) name_test() # 局部变量外面无法使用 # print(name) # 打印全局变量 print(name2) 运行结果 abc123 test01使用 global 关键字声明全局变量name_t test01 def name_test(): name_a abc123 # 在方法里面定义局部变量name print(name_a) global name_d name_d dev007 name_test() # 局部变量外面无法使用 # print(name_a) # 打印全局变量 print(name_d) 运行结果 abc123 dev007递归函数在一个函数体内调用它自身被称为函数递归自己调用自己函数递归包含了一种隐式的循环它会重复执行某段代码但是这种重复执行无需循环控制例如求 123...100 之和使用递归实现数学公式f(n)nf(n-1)def cel(n): # 递归出口 if n 1: return 1 return n cel(n-1) print(cel(100)) 运行结果 5050注意点递归算法必须要有一个递归出口条件否则会无限死循环斐波那契数列示例斐波那契数列递归解法0、1、1、2、3、4、5、13、21、34、55、89、...... 这个数列从第3项开始每一项都等于前两项之和显然这是一个线性递推数列。在数学上斐波那契数列以如下被以递推的方法定义F(0)0,F(1)1,F(n)F(n-1)F(n-2) (n3n∈N*)def cel(n): # 递归出口基本情况F(0)0F(1)1 if n 0: return 0 elif n 1: return 1 # 递归情况F(n)F(n-1)F(n-2) else: return cel(n - 1) cel(n - 2) # 计算斐波那契数列的第m个数字 m 15 print(f斐波那契数列的第{m}个数字是{cel(m)})斐波那契数列Fibonacci sequence又称黄金分割数列、因数学家列昂纳多·斐波那契Leonardoda Fibonacci以兔子繁殖为例子而引入故又称为“兔子数列”指的是这样一个数列1、1、2、3、5、8、13、21、34、……在数学上斐波纳契数列以如下被以递归的方法定义F(0)1F(1)1, F(n)F(n-1)F(n-2)n2n∈N*拓展斐波那契数亦称之为斐波那契数列意大利语 Successione di Fibonacci)又称黄金分割数列、费波那西数列、费波拿契数、费氏数列和兔子数列指的是这样一个数列0、1、1、2、3、5、8、13、21、……在数学上斐波纳契数列以如下被以递归的方法定义F00F11FnF(n-1)F(n-2)n2n∈N*用文字来说就是斐波那契数列列由 0 和 1 开始之后的斐波那契数列系数就由之前的两数相加。由来在数学历史上欧洲黑暗时期过后第一位有影响的数学家是斐波那契(LFibonacci1170一1250)。他早年就随其父在北非师从阿拉伯人学习算学后又游历地中海沿岸诸国回意大利后写成《算经[xq2] 》也翻译成《算盘书》。这部很有名的著作主要是一些源自古代中国、印度和希腊的数学问题的汇集内容涉及整数和分数算法、开方法、二次和三次方程以及不定方程。特别是在1228年的《算经》修订版上载有如下“兔子问题”如果每对兔子一雄一雌每月能生殖一对小兔子也是一雄 一[xq3] 雌下同每对兔子第一个月没有生殖能力但从第二个 月[xq4] 以后便能每月生一对小兔子.假定[xq5] 这些兔子都没有死亡现象那么从第一对刚出生的兔子开始12 个月以后会有多少 对[xq6] 兔子呢 解释说明为一个月[xq7] 只有一对兔子第二个月 仍然只有一对兔子第三个月这对兔子生了一对小兔子 共有 112 对兔子.第四个月[xq8] 最初的一对兔子又生一对兔 子共有 213 对兔子.则由第一个月到第十二个月兔子的 对数分别是1123581321345589144 ……后 人[xq9] 为了纪念提出兔子繁殖问题的斐波纳契 将这个兔子数 列[xq10] 称为斐波那契数列 即把 112358132134……这样的数列称为斐波那契数列。未完待续......