*args
和 **kwargs
的区别:
*args
:
- 在Python函数定义中,
*args
用于收集所有位置参数(即没有参数名,按顺序传入的参数),并将它们作为一个元组传递给函数。它的名字 args
可以自定义,但通常习惯用 args
。
- 例如:
def print_args(*args):
for arg in args:
print(arg)
print_args(1, 'hello', [1, 2, 3])
- **适用场景**:当你不确定函数会接收到多少个位置参数时,就可以使用 `*args`。比如在实现一个计算多个数之和的函数时:
def sum_numbers(*args):
total = 0
for num in args:
if isinstance(num, (int, float)):
total += num
return total
result = sum_numbers(1, 2, 3.5)
print(result)
**kwargs
:
**kwargs
用于收集所有关键字参数(即带有参数名的参数),并将它们作为一个字典传递给函数。同样,kwargs
这个名字可以自定义,但通常用它。
- 例如:
def print_kwargs(**kwargs):
for key, value in kwargs.items():
print(f"{key}: {value}")
print_kwargs(name='Alice', age=30, city='New York')
- **适用场景**:当你不确定函数会接收到多少个关键字参数,或者你想以一种灵活的方式传递参数时,适合使用 `**kwargs`。比如在实现一个根据不同配置执行不同操作的函数时:
def perform_action(**kwargs):
if 'action' in kwargs:
if kwargs['action'] == 'print':
print(kwargs.get('message', 'No message provided'))
elif kwargs['action'] == 'add':
num1 = kwargs.get('num1', 0)
num2 = kwargs.get('num2', 0)
print(num1 + num2)
perform_action(action='print', message='Hello, world!')
perform_action(action='add', num1=5, num2=3)
- 编写既能接受任意数量位置实参又能接受任意数量关键字实参的函数:
def format_and_print(*args, **kwargs):
print("Position arguments:")
for index, arg in enumerate(args, start = 1):
print(f" Arg {index}: {arg}")
print("Keyword arguments:")
for key, value in kwargs.items():
print(f" {key}: {value}")
format_and_print(1, 'two', [3], name='John', age=25)