在定义一个带参函数时,我们可以定义参数为位置参数或命名关键字参数。它们在函数定义和调用时有一些区别。
1、位置参数:
位置参数是最常见的参数类型,它们按照定义时的顺序进行传递。在函数定义中,参数按顺序声明,调用函数时需要按照相同的顺序传递参数,如:
def greet(name, age):print(f"Hello, {name}. You are {age} years old.")greet("Alice", 30) # 位置参数传递
2、命名关键字参数:
命名关键字参数是在位置参数后面的参数,调用时必须使用参数名进行传递。这样可以避免参数顺序错误导致的混乱,如:
def greet(name, age, city='New York'):print(f"Hello, {name}. You are {age} years old. You live in {city}.")greet("Bob", 25, city='Los Angeles') # 使用命名关键字参数传递
3、区别:
- 位置参数必须按照函数定义的顺序传递,而命名关键字参数则可以根据参数名进行传递,不受顺序限制。
- 命名关键字参数在函数定义时可以指定默认值,而位置参数不可以。
如下实例:
def greet(name, age, city='New York'):print(f"Hello, {name}. You are {age} years old. You live in {city}.")greet("Alice", 30) # 默认使用 New York
greet("Bob", 25, city='Los Angeles') # 指定 Los Angeles
greet(name="Charlie", age=35) # 使用命名关键字参数传递
greet(city='Los Angeles',name="Charlie", age=35) # 使用命名关键字参数传递,不受顺序限制
4、其它用法:
除了上面的常规用法,我们还可以使用一个单独的星号*
来标志位置参数的结束,从而区分位置参数和命名关键字参数。
即写在*
前面的参数为位置参数,调用函数时,只需对号入座,而写在*
后面的参数为命名关键字参数,调用时,必须写成“参数名=参数值”的形式。
这种语法明确指定了参数的传递方式,特别是当函数参数较多或者参数含有默认值时,可以提高函数的可读性,并防止参数传递时的混淆。
如下示例:
def my_function(a, b, *, c, d):print(a, b, c, d)my_function(1, 2, c=3, d=4) # 正确调用
# my_function(1, 2, 3, 4) # 错误调用,会引发错误
在上面的示例中,a
和b
在*
前面,是位置参数,而c
和d
在*
后面,是命名关键字参数。所以c和
d`必须使用关键字参数进行传递。
说明:
- 在
*
之前的参数是位置参数,调用函数时,必须按照顺序传递。 - 在
*
之后的参数是命名关键字参数,必须使用关键字参数进行传递,即必须写成“参数名=参数值”的形式。