1. 位置参数(Positional Arguments)
- 直接传入:可以直接按照顺序传入参数值,即直接传入实参值
- 关键字形式传递:也可以通过关键字的形式传递。即key = value的形式,其中key为函数形参的参数名字,value为传入实参
2. 默认参数(Default Arguments)
- 直接传入:可以直接按照顺序传入参数值。
- 关键字形式传递:也可以通过关键字的形式传递。
3. 关键字参数(Keyword Arguments)
- 必须通过关键字的形式传递:关键字参数的名字必须与函数定义中的名字一致,并且是以
key=value
的形式传递。 - 数量可变:可以传入任意数量的关键字参数,这些参数在函数内部会被收集到一个字典中。
4. 可变参数(Variable-length Arguments)
可变参数包括两种形式:*args
和 **kwargs
。
-
*args
(可变位置参数):- 允许传入任意数量的位置参数,这些参数会以元组的形式传递给函数。
- 不能通过关键字形式传递。
-
**kwargs
(关键字参数):- 允许传入任意数量的关键字参数,这些参数会以字典的形式传递给函数。
- 必须使用关键字形式传递
def example_func(a, b=2, *args, **kwargs):
print("a:", a)
print("b:", b)
print("args:", args)
print("kwargs:", kwargs)
# 直接传入位置参数
example_func(1)
# 输出:
# a: 1 位置参数
# b: 2
# args: () 可变参数
# kwargs: {} 关键字参数
# 使用关键字形式传递位置参数和默认参数
example_func(a=1, b=3)
# 输出:
# a: 1
# b: 3
# args: ()
# kwargs: {}
# 使用位置参数传递可变参数
example_func(1, 2, 3, 4, 5)
# 输出:
# a: 1
# b: 2
# args: (3, 4, 5)
# kwargs: {}
# 使用关键字形式传递关键字参数
example_func(1, 2, 3, name="Alice", age=30)
# 输出:
# a: 1
# b: 2
# args: (3,)
# kwargs: {'name': 'Alice', 'age': 30}
5. 命名关键字参数
命名关键字参数限定了传入的形参的名字,调用时必须以规定的命名作为关键字,以关键字的形式传递,当定义的函数中没有可变参数时,其与位置参数或默认参数之间要通过*进行分隔,例如:
def example_func(a, *, b, c):
print(a, b, c)
example_func(1, b=2, c=3) # 输出: 1 2 3
其中a为位置参数,b、c为命名关键字参数,b、c调用时必须采用规定的名字(b、c)作为关键字进行传入。
当函数中有可变位置参数时,可变位置参数与命名关键字参数之间不需要加入*,原因也比较简单,因为可变位置参数调用不可通过关键字的形式进行传入,而命名关键字参数或关键字参数必须通过关键字形式传入,可以有效区分。例如:
def example_func(a, *args, b, c):
print(a, args, b, c)
example_func(1, 2, 3, b=4, c=5) # 输出: 1 (2, 3) 4 5
函数中的args为可变位置参数,而b、c为命名关键字参数。
6、函数参数的组合使用
当函数中同时存在各种函数参数时(不建议,因为会降低代码可读性),其从前到后的顺序为位置参数、默认参数、可变参数、命名关键字参数、关键字参数。