python中位置参数,默认参数,可变参数,关键字参数等等相关参数介绍
-
位置参数(Positional Arguments)
- 定义和特点:位置参数是最基本的函数参数类型。在调用函数时,实参(传递给函数的参数)的顺序和位置必须与函数定义中的形参(函数定义中的参数)顺序完全一致。例如:
def add_numbers(x, y): return x + y result = add_numbers(3, 5)
- 在这个函数
add_numbers
中,x
和y
是位置参数。当调用该函数时,第一个实参3
会赋值给x
,第二个实参5
会赋值给y
,函数按照这个顺序来使用参数进行计算。如果实参的顺序改变,如add_numbers(5, 3)
,则函数的计算结果可能不同。 -
默认参数(Default Arguments)
- 定义和设置方式:默认参数是在函数定义时为参数指定一个默认值。在调用函数时,如果没有为默认参数提供实参,函数将使用默认值。例如:
def greet(name, greeting="Hello"): return f"{greeting}, {name}!" print(greet("Alice")) print(greet("Bob", "Hi"))
- 在函数
greet
中,greeting
是默认参数,其默认值为Hello
。当只传递一个参数"Alice"
时,函数使用默认的问候语Hello
;当传递两个参数,如"Bob"
和"Hi"
时,第二个参数"Hi"
会覆盖默认值,作为问候语使用。 - 注意事项:默认参数应该放在位置参数之后定义,否则会导致语法错误。因为函数在解析参数时,会先按照位置顺序匹配参数,然后再考虑默认参数。
-
可变参数(Variable – length Arguments)
- 可变位置参数(*args):
- 定义和使用方法:
*args
用于接收任意数量的位置参数,它将这些参数收集到一个元组(tuple)中。在函数内部,可以像处理普通元组一样处理*args
。例如:def sum_numbers(*args): return sum(args) print(sum_numbers(1, 2, 3))
- 在函数
sum_numbers
中,*args
收集了所有传递进来的位置参数,如1
、2
、3
,并将它们组成一个元组(1, 2, 3)
,然后通过sum
函数计算这些参数的总和。 - 可变关键字参数(kwargs):
- 定义和使用方法:
**kwargs
用于接收任意数量的关键字参数,它将这些参数收集到一个字典(dictionary)中。关键字参数是通过键 – 值对的形式传递的,在函数内部,可以像处理普通字典一样处理**kwargs
。例如:def print_info(**kwargs): for key, value in kwargs.items(): print(f"{key}: {value}") print_info(name="Alice", age=25, city="New York")
- 在函数
print_info
中,**kwargs
收集了所有的关键字参数,如name="Alice"
、age = 25
、city="New York"
,并将它们组成一个字典{"name": "Alice", "age": 25, "city": "New York"}
,然后遍历字典并打印出每个键 – 值对。 -
关键字参数(Keyword Arguments)
- 定义和特点:关键字参数是通过键 – 值对的形式传递给函数的参数。与位置参数不同,关键字参数在传递时明确指定了参数名和对应的值,这样实参的顺序就不那么重要了。例如:
def describe_person(name, age, occupation): return f"{name} is {age} years old and works as a {occupation}." print(describe_person(age=30, name="Bob", occupation="Engineer"))
- 在这个例子中,调用函数
describe_person
时,通过关键字参数明确指定了每个参数的值对应的参数名,所以实参的顺序可以与函数定义中的形参顺序不同,函数仍然能够正确地使用这些参数来生成描述信息。 - 与位置参数混合使用:关键字参数可以和位置参数一起使用,但位置参数必须在关键字参数之前。例如:
describe_person("Charlie", age=35, occupation="Teacher")
,这里第一个参数"Charlie"
是位置参数,按照位置顺序赋值给name
,后面的age
和occupation
是关键字参数。 -
命名关键字参数
- 定义和语法
- 命名关键字参数是 Python 函数参数中的一种特殊类型。它要求调用者在传递参数时必须使用参数名,位于
*
之后的参数被视为命名关键字参数。语法上,在函数定义中,在可变位置参数(*args
)之后或者单独使用一个*
来分隔位置参数和命名关键字参数。例如:def func(a, b, *, c, d): print(a, b, c, d)
- 在这个函数
func
中,a
和b
是位置参数,c
和d
是命名关键字参数。调用这个函数时,必须明确使用参数名来传递c
和d
的值,如func(1, 2, c = 3, d = 4)
。 - 与其他参数类型的比较和关联
- 与位置参数:
- 位置参数是按照参数的位置来传递和接收的,而命名关键字参数则是通过参数名来传递,位置信息相对不那么重要。在函数调用中,位置参数必须先传递,且顺序要与函数定义中的顺序一致,然后才能传递命名关键字参数。例如在
func
函数中,不能先传递c
和d
的值,必须先传递a
和b
的值。 - 与默认参数:
- 命名关键字参数可以有默认值。如果为命名关键字参数设置了默认值,在调用函数时,如果没有为该参数传递值,就会使用默认值。例如:
def func_with_default(a, b, *, c = 3, d): print(a, b, c, d) func_with_default(1, 2, d = 4)
- 这里
c
是有默认值的命名关键字参数,在调用函数func_with_default
时,没有传递c
的值,所以c
使用默认值3
。 - 与可变参数(
*args
和**kwargs
): - 在函数定义中,可变位置参数(
*args
)可以在命名关键字参数之前。*args
会收集所有未匹配的位置参数,而命名关键字参数则是在位置参数和*args
之后,通过明确的参数名来接收参数。例如:def func_with_args(a, *args, b, c): print(a, args, b, c) func_with_args(1, 2, 3, b = 4, c = 5)
- 在这个函数中,
a
是位置参数,*args
收集了2
和3
,b
和c
是命名关键字参数。同时,可变关键字参数(**kwargs
)也可以和命名关键字参数一起使用,**kwargs
会收集所有未匹配的关键字参数,并且通常在命名关键字参数之后定义,用于更灵活的参数接收。 - 使用场景和优势
- 提高代码可读性:
- 命名关键字参数使得函数调用的意图更加明确,特别是当函数有多个参数时,通过明确的参数名来传递参数,可以让阅读代码的人更容易理解每个参数的用途。例如,在一个函数用于初始化一个用户对象,有参数如
user_id
、user_name
、email
等,使用命名关键字参数init_user(*, user_id, user_name, email)
可以清晰地看到每个参数的作用,避免混淆。 - 参数验证和约束:
- 它可以对参数的传递进行一定的约束。因为调用者必须使用指定的参数名来传递参数,这样可以防止一些因参数顺序错误或者不恰当的参数传递而导致的错误。例如,如果有一个函数用于绘制图形,参数有
shape_type
(图形类型)和color
(颜色),使用命名关键字参数可以确保调用者明确指定图形类型和颜色,而不是依赖于位置来传递可能会出错的参数值。 -
参数调用
- 按位置调用参数(位置参数调用)
- 基本规则:
- 当函数定义了多个位置参数时,在调用函数时按照参数定义的顺序依次传入实参。例如,对于函数
def add_numbers(x, y): return x + y
,调用add_numbers(3, 5)
时,3 会被赋值给x
,5 会被赋值给y
,这是最基本的参数调用方式。 - 易错点:
- 实参的数量必须与函数定义中的形参数量一致,否则会出现错误。如果提供的实参过多,Python 会提示
TypeError
,表示提供了过多的参数;如果实参过少,也会出现类似错误,因为有部分形参没有接收到值。 - 按关键字调用参数(关键字参数调用)
- 基本规则:
- 可以使用参数名来指定传递给函数的参数值,这样实参的顺序就可以和形参的顺序不同。例如,对于函数
def describe_person(name, age, occupation): return f"{name} is {age} years old and works as a {occupation}."
,可以调用describe_person(age = 30, name = "Bob", occupation = "Engineer")
,通过参数名明确地将值赋给对应的形参。 - 混合使用位置参数和关键字参数:
- 在调用函数时,可以先使用位置参数,再使用关键字参数,但位置参数必须在关键字参数之前。例如,
describe_person("Charlie", age = 35, occupation = "Teacher")
,第一个位置参数"Charlie"
会按照顺序赋值给name
,后面的关键字参数age
和occupation
会按照名称赋值。不过,如果先使用关键字参数,再使用位置参数,就会出现语法错误。 - 使用默认参数值
- 基本规则:
- 当函数定义了默认参数时,在调用函数时,如果没有为默认参数提供新的值,函数会使用默认值。例如,
def greet(name, greeting="Hello"): return f"{greeting}, {name}!"
,调用greet("Alice")
时,因为没有提供greeting
的值,所以函数会使用默认的Hello
。 - 覆盖默认值:
- 如果想要使用新的值,可以像普通参数一样传递。例如,
greet("Bob", "Hi")
,这里Hi
会覆盖默认的Hello
作为问候语。 - 可变参数调用(
*args
和**kwargs
) - 可变位置参数(
*args
)调用: - 传递多个位置参数:
*args
用于接收任意数量的位置参数,在调用函数时,可以直接传递多个位置参数,这些参数会被收集到一个元组中。例如,对于函数def sum_numbers(*args): return sum(args)
,可以调用sum_numbers(1, 2, 3)
,1、2、3 会被收集到args
元组中,然后计算它们的总和。 - 解包参数列表:还可以将一个包含多个元素的可迭代对象(如列表、元组)解包后传递给
*args
。例如,numbers = [1, 2, 3]; sum_numbers(*numbers)
,这里*numbers
会将列表中的元素解包后传递给sum_numbers
函数,效果和直接传递1, 2, 3
是一样的。 - 可变关键字参数(
**kwargs
)调用: - 传递多个关键字参数:
**kwargs
用于接收任意数量的关键字参数,这些参数会被收集到一个字典中。例如,对于函数def print_info(**kwargs): for key, value in kwargs.items(): print(f"{key}: {value})"
,可以调用print_info(name="Alice", age=25, city="New York")
,这些关键字参数会被收集到kwargs
字典中,然后遍历字典打印出键 – 值对。 - 解包字典参数:可以将一个字典解包后传递给
**kwargs
。例如,info_dict = {"name": "Bob", "age": 30}; print_info(**info_dict)
,这样字典中的键 – 值对会作为关键字参数传递给print_info
函数。 - 命名关键字参数调用
- 基本规则:
- 对于命名关键字参数,在调用函数时必须使用参数名来传递参数。例如,对于函数
def func(a, b, *, c, d): print(a, b, c, d)
,调用时必须使用func(1, 2, c = 3, d = 4)
这样的形式,明确指定c
和d
的值。 - 与默认参数结合:
- 如果命名关键字参数有默认值,在调用函数时可以选择是否提供新的值。例如,
def func_with_default(a, b, *, c = 3, d): print(a, b, c, d)
,可以调用func_with_default(1, 2, d = 4)
,这里c
会使用默认值 3。
作者:ww哈哈哈ww