开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第4天,点击查看活动详情
函数
编程中的函数, 是一段 可以被重复使用的代码片段
举个例子:当我们要求数列的和,不用函数
我们可以看到这几组代码重复度是非常高的而我们把求和写成一个函数,减少代码冗余
语法格式
创建函数/定义函数
形参列表中,形参之间使用,分隔。函数体要带一层缩进,函数执行到return,就意味着执行完了
调用函数/使用函数
函数名(实参列表) // 不考虑返回值
返回值 = 函数名(实参列表) // 考虑返回值
函数定义并不会执行函数体内容, 必须要调用才会执行. 调用几次就会执行几次
函数必须先定义, 再使用
函数参数
在函数定义的时候, 可以在 ( ) 中指定 "形式参数" (简称 形参), 然后在调用的时候, 由调用者把 "实际参数"(简称 实参) 传递进去
这样就可以做到一份函数, 针对不同的数据进行计算处理
注意: 一个函数可以有一个形参, 也可以有多个形参, 也可以没有形参
一个函数的形参有几个, 那么传递实参的时候也得传几个. 保证个数要匹配
Python 是动态类型的编程语言, 函数的形参不必指定参数类型. 换句话说, 一个函数可以支持多种不同类型的参数
函数返回值
函数的参数可以视为是函数的 "输入", 则函数的返回值, 就可以视为是函数的 "输出"
![]()
这两个代码的区别就在于, 前者直接在函数内部进行了打印, 后者则使用 return 语句把结果返回给函数调用者, 再由调用者负责打印
一个函数中可以有多个 return 语句
执行到 return 语句, 函数就会立即执行结束, 回到调用位置
一个函数是可以一次返回多个返回值的. 使用 , 来分割多个返回值
如果只想关注其中的部分返回值, 可以使用 _ 来忽略不想要的返回值
变量作用域
在这个代码中, 函数内部存在 x, y, 函数外部也有 x, y 但是这两组 x, y 不是相同的变量, 而只是恰好有一样的名字
变量只能在所在的函数内部生效 在函数 test() 内部定义的 x, y 只是在函数内部生效. 一旦出了函数的范围, 这两个变量就不再生效了
在不同的作用域中, 允许存在同名的变量 虽然名字相同, 实际上是不同的变量
注意: 在函数内部的变量, 也称为 "局部变量" 不在任何函数内部的变量, 也称为 "全局变量"
如果函数内部尝试访问的变量在局部不存在, 就会尝试去全局作用域中查找
如果是想在函数内部, 修改全局变量的值, 需要使用 global 关键字声明
==注意==:f,else,while,for这些关键字也会引入代码块,但是这些代码块不会对变量的作用域产生影响,在上述语句代码块内部定义的变量可以在外面被访问
函数执行过程
调用函数才会执行函数体代码. 不调用则不会执行 函数体执行结束(或者遇到 return 语句), 则回到函数调用位置, 继续往下执行
链式调用
把一个函数的返回值, 作为另一个函数的参数, 这种操作称为 链式调用
嵌套调用
函数内部还可以调用其他的函数, 这个动作称为 "嵌套调用" test 函数内部调用了 print 函数, 这里就属于嵌套调用
一个函数里面可以嵌套调用任意多个函数
![]()
函数递归
递归是嵌套调用中的一种特殊情况, 即一个函数嵌套调用自己
举个例子:递归计算5!
![]()
递归的优点 1.递归类似于 "数学归纳法" , 明确初始条件, 和递推公式, 就可以解决一系列的问题. 2.递归代码往往代码量非常少. 递归的缺点 1.递归代码往往难以理解, 很容易超出掌控范围 2.递归代码容易出现栈溢出的情况 3.递归代码往往可以转换成等价的循环代码. 并且通常来说循环版本的代码执行效率要略高于递归版本
参数默认值
Python 中的函数, 可以给形参指定默认值
带有默认值的参数, 可以在调用的时候不传参
代码示例: 计算两个数字的和
当我们只想让用户知道结果,而我们想要知道其中间的执行过程时,我们可以引入参数默认值,如下图所示,当debug为True时,我们就可以看到其执行过程,此处debug=False 即为参数默认值. 当我们不指定第三个参数的时候, 默认debug的取值即为False
带有默认值的参数需要放到没有默认值的参数的后面
关键字参数
在调用函数的时候, 需要给函数指定实参. 一般默认情况下是按照形参的顺序, 来依次传递实参的,但是我们也可以通过关键字参数, 来调整这里的传参顺序, 显式指定当前实参传递给哪个形参
如上述 test(x=10, y=20) 这样的操作, 即为 ==关键字参数==