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}