python函数的不同类型的参数
在Python中定义函数时,可以给函数指定一些参数。今天我们就来讲一下这些参数的类型。函数的参数主要可以划分成:位置参数、默认参数、关键字参数、可变位置参数、可变关键字参数。需要说明的是,关键字参数严格来说只是一种参数的调用方式。
1. 位置参数
位置参数是最常见的参数类型,使用时只要注意参数的位置顺序和参数的数量就行。
注意:传值的数量要跟位置参数数量一致。比如上面定义的 f 函数要求传入两个参数,如果调用时只传入了一个参数,就会报错。
比如,
def f(a, b):
print(f"a的值是: {a}, b的值是: {b}")
f(1, 2) # 按照位置顺序传入参数,a等于1,b等于2
# f(1) # 会报错,因为只传入了一个参数,而函数f需要两个参数
2. 默认参数
我们可以给某些参数设置默认值,这样这个参数就变成了默认参数。如果调用函数时没传入该参数的值,就会使用这个默认值作为参数的值。
比如:
def f(a, b=3):
print(f"a的值是: {a}, b的值是: {b}")
f(1) # 这里只传入了a的值,b使用默认值3
f(1, 2) # 这里传入了a和b的值,b使用传入的值2
注意:默认参数必须放在位置参数之后,否则会导致语法错误。比如下面的代码就会报错:
# def f(a=1, b): # 会报错,因为默认参数a在位置参数b之前
3. 关键字参数
当函数有很多个参数时,按位置传值很容易弄错参数的对应关系。我们在调用函数时,可以指定参数名传值,这样传入的参数就是关键字参数。比如:
def f(a, b, c=4):
print(f"a的值是: {a}, b的值是: {b}, c的值是: {c}")
f(b=2, a=1) # 使用关键字参数调用,指定参数名传值,位置可以任意调换
注意:关键字参数在定义时,跟位置参数和默认参数没什么两样,只是在调用上,使用了关键字来传值调用。对于位置参数,还是全部都要有的,如果有漏掉,就会出错。另外,普通调用和关键字调用可以混合使用,但所有关键字调用必须要在普通调用的后面,否则会出错。例如:
# f(1, c=3, b=2) # 正确,前面是普通调用,后面是关键字调用
# f(1, c=3, 2) # 会报错,因为普通调用2放在了关键字调用后面
4. 可变位置参数
在编写函数时,有时我们不确定会传入多少参数,这时就需要用到可变位置参数。可变位置参数是指参数数量可变,定义函数时,可以用星号 * 来收集多个位置参数,将它们打包成一个元组。
def f(a, *b):
print(f"a的值是: {a}")
print(f"可变位置参数b是: {b}")
print(f"可变位置参数b的第一个值是: {b[0]}")
f(1, 2, 3, 4) # 传入一个位置参数a和多个可变位置参数,可变位置参数被打包成元组
注意:可变位置参数必须要在所有位置参数的后面。比如下面的代码就会出错:
# def f(a, b, *c, d): # 会报错,因为位置参数d在可变位置参数*c后面
虽然可以把默认参数放在可变位置参数后面,但使用这个默认参数时,就要用关键字调用,否则不管传入多少个参数,都会全部归到可变位置参数里面去。默认参数也可以放在可变位置参数前面,但这样默认值就只有在可变位置参数传入值为空时才用得上。
5. 可变关键字参数
如果遇到数量不确定的关键字参数,可以使用两个星号 ** 来定义可变关键字参数,这样可以收集多个关键字参数,将它们打包成一个字典。
def f(**kwargs):
print(f"可变关键字参数是: {kwargs}")
for key, value in kwargs.items():
print(f"键: {key}, 值: {value}")
f(name="Alice", age=25, city="New York") # 传入多个关键字参数,被打包成字典
注意:使用可变关键字参数时,必须把它放在位置参数的后面,否则会出错。另外,可变关键字参数必须要以关键字的形式传入,不能传入位置参数,否则也会报错。例如:
def f(a, **kwargs):
print(a, kwargs)
f(1, name="Bob") # 正确,位置参数a在前,可变关键字参数在后
# f(1, "Bob") # 会报错,因为不能在可变关键字参数中传入位置参数
在使用函数参数时,还有一些其他注意事项。本次教程主要讲解了参数的分类,其他内容我们会在后续的教程中讲解,感兴趣的朋友可以持续关注哦。