函数 是一段可以被重复使用的代码片段
def 函数名(形参列表):
函数体
return 返回值
函数名(实参列表) #不考虑返回值
返回值 = 函数名(实参列表) #考虑返回值
函数定义并不会执行函数体内容, 必须要调用才会执行. 调用几次就会执行几次
函数必须先定义, 再使用
在函数定义的时候, 可以在 ( ) 中指定 “形式参数” ,然后在调用的时候,由调用者把 “实际参数” 传递进去,这样就可以做到一份函数,针对不同的数据进行计算处理
- 一个函数可以有一个形参, 也可以有多个形参, 也可以没有形参
- 一个函数的形参有几个, 那么传递实参的时候也得传几个. 保证个数要匹配
- 和 C++ / Java 不同, Python 是动态类型的编程语言, 函数的形参不必指定参数类型. 换句话说, 一个函数可以支持多种不同类型的参数
函数的参数可以视为是函数的 “输入”, 则函数的返回值, 就可以视为是函数的 “输出”
- 一个函数中可以有多个 return 语句,执行到 return 语句, 函数就会立即执行结束, 回到调用位置
- 一个函数是可以一次返回多个返回值的。使用 , 来分割多个返回值
- 如果只想关注其中的部分返回值, 可以使用 _ 来忽略不想要的返回值
global
关键字声明函数内部还可以调用其他的函数, 这个动作称为 “嵌套调用”。一个函数里面可以嵌套调用任意多个函数
把一个函数的返回值, 作为另一个函数的参数, 这种操作称为 链式访问
递归是 嵌套调用 中的一种特殊情况, 即一个函数嵌套调用自己
# 计算斐波那契数列
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) 这样的操作, 即为 关键字参数