Python中*args和**kwargs
*args 的基本用法
*args 允许函数接收任意数量的位置参数,这些参数会被自动打包成一个元组。在函数内部,可以通过遍历元组来处理这些参数。
def sum_numbers(*args):print("args 类型:", type(args)) # <class 'tuple'>total = 0for num in args:total += numreturn total# 调用函数时可以传入任意数量的参数
print(sum_numbers(1, 2, 3)) # 6
print(sum_numbers(10, 20, 30, 40)) # 100
print(sum_numbers()) # 0(可以传入0个参数)
**kwargs 的基本用法
**kwargs 用于接收任意数量的关键字参数,这些参数会被自动收集到一个字典中,其中键是参数名,值是对应的参数值。
def show_info(**kwargs):print("kwargs 类型:", type(kwargs)) # <class 'dict'>for key, value in kwargs.items():print(f"{key}: {value}")# 调用函数时传入关键字参数
show_info(name="Alice", age=30, city="New York")
# 输出:
# name: Alice
# age: 30
# city: New Yorkshow_info(product="Laptop", price=999)
# 输出:
# product: Laptop
# price: 999
混合使用 *args 和 **kwargs
在函数定义中,可以同时使用 *args 和 **kwargs,但必须按照以下顺序:普通参数、*args、**kwargs。
def mixed_function(arg1, arg2, *args, **kwargs):print("Fixed arguments:", arg1, arg2)print("Additional positional arguments:", args)print("Additional keyword arguments:", kwargs)mixed_function(1, 2, 3, 4, key1="value1", key2="value2")
参数解包的应用
在调用函数时,可以使用 * 和 ** 来解包列表/元组和字典,将其内容作为参数传递给函数。
def add(x, y, z):return x + y + znumbers = [10, 20, 30]
print(add(*numbers)) # 等价于 add(10, 20, 30) → 60def person_info(name, age):print(f"{name} is {age} years old")info = {"name": "Charlie", "age": 25}
person_info(** info) # 等价于 person_info(name="Charlie", age=25)
实际应用场景
*args 和 **kwargs 在装饰器、函数包装、可变参数处理等场景中非常有用。例如,在装饰器中,通常使用 *args 和 **kwargs 来传递任意参数给被装饰的函数。
def decorator(func):def wrapper(*args, **kwargs):print("Before function call")result = func(*args, **kwargs)print("After function call")return resultreturn wrapper@decorator
def greet(name):print(f"Hello, {name}!")greet("Alice")