2. 函数的参数
上面 sub 函数有两个参数,这种参数叫做位置参数,在调用函数时通常按照从左到右的顺序依次传入,而且传入参数的数量必须和定义函数时参数的数量相同。参数多了或少了,都会报错。
python
# print(sub(3)) # 会报错,告诉你函数还需要一个参数
# print(sub(2, 3, 4)) # 也会报错,告诉你只需要两个参数,三个参数,多了
关键字参数
如果不想按照从左到右的顺序依次给出 x、y 两个参数的值,也可以使用关键字参数,通过"参数名=参数值"的形式为函数传入参数。
python
print(sub(1, 2))
print(sub(y=1, x=2))
# print(sub(a=1, b=2)) # 函数的参数名必须与函数定义的参数名一样
强制位置参数与命名关键字参数
在定义函数时,我们可以在参数列表中用 / 设置强制位置参数,用 * 设置命名关键字参数。所谓强制位置参数,就是调用函数时只能按照参数位置来接收参数值的参数;而命名关键字参数只能通过"参数名=参数值"的方式来传递和接收参数。说明:强制位置参数是 Python 3.8 引入的新特性,在使用低版本的 Python 解释器时需要注意。
python
def sub1(x, y, /):
return x - y
print(sub1(2, 1))
# print(sub1(x=1, y=2)) # 报错
def sub2(*, x, y):
return x - y
print(sub2(x=2, y=1))
# print(sub2(2, 1)) # 报错
▶ 运行结果:
输出
1
1
默认参数
Python 中允许函数的参数拥有默认值,即在定义函数时,在参数列表中给参数赋值。需要注意的是,带默认值的参数必须放在不带默认值的参数之后,否则将产生 SyntaxError 错误,错误消息是:non-default argument follows default argument,翻译成中文的意思是"没有默认值的参数放在了带默认值的参数后面"。
python
def sub3(x=20, y=10): # 定义时给参数赋值
return x - y
print(sub3()) # 使用参数的默认值
print(sub3(3, 3))
▶ 运行结果:
输出
10
0
可变参数
Python 语言中可以通过 * 星号表达式语法让函数支持可变参数。所谓可变参数指的是在调用函数时,可以向函数传入 0 个或任意多个参数。将来我们以团队协作的方式开发商业项目时,很有可能要设计函数给其他人使用,但有的时候我们并不知道函数的调用者会向该函数传入多少个参数,这个时候可变参数就能派上用场。
python
def add(*x): # 可变长度参数
return sum(x)
print(add(1, 2))
print(add(1, 2, 3, 4, 5))
▶ 运行结果:
输出
3
15
可变关键字参数
如果我们希望通过"参数名=参数值"的形式传入若干个参数,具体有多少个参数也是不确定的,我们还可以给函数添加可变关键字参数,把传入的关键字参数组装到一个字典中。
python
def foo(*args, **kwargs):
# 参数列表中的 **kwargs 可以接收0个或任意多个关键字参数
# 调用函数时传入的关键字参数会组装成一个字典
# (参数名是字典中的键,参数值是字典中的值)
# 如果一个关键字参数都没有传入,那么 kwargs 会是一个空字典
print(args)
print(kwargs)
foo(3, 2.1, True, name='骆昊', age=43, gpa=4.95)
# (3, 2.1, True)
# {'name': '骆昊', 'age': 43, 'gpa': 4.95}
▶ 运行结果:
输出
(3, 2.1, True)
{'name': '骆昊', 'age': 43, 'gpa': 4.95}