一、函数的概念
函数 是一段可以被重复使用的代码片段
二、函数的语法格式
2.1 函数的创建
def 函数名(形参列表):
函数体
return 返回值
2.2 函数的调用
函数名(实参列表) #不考虑返回值
返回值 = 函数名(实参列表) #考虑返回值
函数定义并不会执行函数体内容, 必须要调用才会执行. 调用几次就会执行几次
函数必须先定义, 再使用
三、函数的参数
在函数定义的时候, 可以在 ( ) 中指定 “形式参数” ,然后在调用的时候,由调用者把 “实际参数” 传递进去,这样就可以做到一份函数,针对不同的数据进行计算处理
- 一个函数可以有一个形参, 也可以有多个形参, 也可以没有形参
- 一个函数的形参有几个, 那么传递实参的时候也得传几个. 保证个数要匹配
- 和 C++ / Java 不同, Python 是动态类型的编程语言, 函数的形参不必指定参数类型. 换句话说, 一个函数可以支持多种不同类型的参数
四、函数的返回值
函数的参数可以视为是函数的 “输入”, 则函数的返回值, 就可以视为是函数的 “输出”
- 一个函数中可以有多个 return 语句,执行到 return 语句, 函数就会立即执行结束, 回到调用位置
- 一个函数是可以一次返回多个返回值的。使用 , 来分割多个返回值
- 如果只想关注其中的部分返回值, 可以使用 _ 来忽略不想要的返回值
五、变量的作用域
- 变量只能在所在的函数内部生效
- 在不同的作用域中, 允许存在同名的变量
- 在函数内部的变量, 也称为 “局部变量”
- 不在任何函数内部的变量, 也称为 “全局变量”
- 如果函数内部尝试访问的变量在局部不存在, 就会尝试去全局作用域中查找
- 如果是想在函数内部, 修改全局变量的值, 需要使用
global
关键字声明 - if / while / for 等语句块不会影响到变量作用域
六、函数的执行过程
- 调用函数才会执行函数体代码. 不调用则不会执行
- 函数体执行结束(或者遇到 return 语句), 则回到函数调用位置, 继续往下执行
七、嵌套调用与链式访问
函数内部还可以调用其他的函数, 这个动作称为 “嵌套调用”。一个函数里面可以嵌套调用任意多个函数
把一个函数的返回值, 作为另一个函数的参数, 这种操作称为 链式访问
八、函数递归
递归是 嵌套调用 中的一种特殊情况, 即一个函数嵌套调用自己
# 计算斐波那契数列
def factor(n):
if n == 1:
return 1
return n * factor(n - 1)
result = factor(5)
print(result)
注意: 递归代码务必要保证
- 存在递归结束条件. 比如 if n == 1 就是结束条件. 当 n 为 1 的时候, 递归就结束了.
- 每次递归的时候, 要保证函数的实参是逐渐逼近结束条件的.
如果上述条件不能满足, 就会出现 “无限递归” . 这是一种典型的代码错误
九、参数默认值
Python 中的函数,可以给形参指定默认值。带有默认值的参数,可以在调用的时候不传参
def add(x, y, debug=False):
if debug:
print(f'调试信息: x={x}, y={y}')
return x + y
print(add(10, 20))
print(add(10, 20, True))
此处 debug=False 即为参数默认值. 当我们不指定第三个参数的时候, 默认 debug 的取值即为 False
十、关键字参数
在调用函数的时候,需要给函数指定实参,一般默认情况下是按照形参的顺序,来依次传递实参的。但是我们也可以通过关键字参数,来调整这里的传参顺序,显式指定当前实参传递给哪个形参
def test(x, y):
print(f'x = {x}')
print(f'y = {y}')
test(x=10, y=20)
test(y=100, x=200)
形如上述 test(x=10, y=20) 这样的操作, 即为 关键字参数