在 Python 中,*args
和 **kwargs
用于函数的可变参数,可以让函数接受 任意数量 的参数,提供更大的灵活性。
1. *args
:可变位置参数
*args
允许函数接受 任意数量 的位置参数(positional arguments)。- 传入的参数会被打包成元组(tuple)。
示例 1:使用 *args
传递多个参数
def add_numbers(*args):return sum(args)print(add_numbers(1, 2, 3)) # 输出:6
print(add_numbers(10, 20, 30, 40)) # 输出:100
解释:
add_numbers(1, 2, 3)
实际上等价于add_numbers((1, 2, 3))
args
在函数内部是一个元组:args = (1, 2, 3)
示例 2:*args
结合普通参数
def greet(message, *names):for name in names:print(f"{message}, {name}!")greet("Hello", "Alice", "Bob", "Charlie")
# 输出:
# Hello, Alice!
# Hello, Bob!
# Hello, Charlie!
解释:
message
是普通参数,必须提供。*names
是可变参数,接收所有额外的参数,存为元组。
2. **kwargs
:可变关键字参数
**kwargs
允许函数接受 任意数量 的关键字参数(key-value 对)。- 传入的参数会被打包成字典(dict)。
示例 1:使用 **kwargs
传递多个关键字参数
def print_info(**kwargs):for key, value in kwargs.items():print(f"{key}: {value}")print_info(name="Alice", age=25, city="New York")
# 输出:
# name: Alice
# age: 25
# city: New York
解释:
kwargs
在函数内部是一个字典:kwargs = {'name': 'Alice', 'age': 25, 'city': 'New York'}
示例 2:**kwargs
结合普通参数
def introduce(name, **info):print(f"My name is {name}.")for key, value in info.items():print(f"My {key} is {value}.")introduce("Alice", age=25, city="New York", hobby="reading")
# 输出:
# My name is Alice.
# My age is 25.
# My city is New York.
# My hobby is reading.
3. *args
和 **kwargs
结合使用
可以在同一个函数中同时使用 *args
和 **kwargs
,但顺序必须是:
- 普通参数
*args
**kwargs
def demo_function(a, b, *args, **kwargs):print(f"a = {a}, b = {b}")print(f"args = {args}")print(f"kwargs = {kwargs}")demo_function(1, 2, 3, 4, 5, name="Alice", age=25)
# 输出:
# a = 1, b = 2
# args = (3, 4, 5)
# kwargs = {'name': 'Alice', 'age': 25}
解释:
a, b
是普通参数。*args
接收(3, 4, 5)
作为元组。**kwargs
接收{'name': 'Alice', 'age': 25}
作为字典。
4. *args
和 **kwargs
用于函数参数解包
(1)用 *args
传递列表或元组
def sum_numbers(a, b, c):return a + b + cnums = [1, 2, 3]
print(sum_numbers(*nums)) # 输出:6
解释:
*nums
解包 列表[1, 2, 3]
,相当于sum_numbers(1, 2, 3)
(2)用 **kwargs
传递字典
def show_info(name, age, city):print(f"Name: {name}, Age: {age}, City: {city}")person = {"name": "Alice", "age": 25, "city": "New York"}
show_info(**person)
# 输出:
# Name: Alice, Age: 25, City: New York
解释:
**person
解包 字典{"name": "Alice", "age": 25, "city": "New York"}
,相当于show_info(name="Alice", age=25, city="New York")
5. *args
vs **kwargs
的区别
对比项 | *args | **kwargs |
---|---|---|
接收参数类型 | 位置参数((1, 2, 3) ) | 关键字参数({"name": "Alice"} ) |
存储数据类型 | 元组(tuple) | 字典(dict) |
参数传递方式 | func(1, 2, 3) | func(name="Alice", age=25) |
适用场景 | 传递 多个值 | 传递 多个键值对 |
6. 总结
用法 | 作用 | 示例 |
---|---|---|
*args | 处理可变数量的位置参数 | def foo(*args): print(args) |
**kwargs | 处理可变数量的关键字参数 | def foo(**kwargs): print(kwargs) |
*args 和 **kwargs | 同时使用,接收任意参数 | def foo(a, *args, **kwargs): ... |
*args 进行列表/元组解包 | func(*[1, 2, 3]) | func(1, 2, 3) |
**kwargs 进行字典解包 | func(**{"x": 1, "y": 2}) | func(x=1, y=2) |
✅ *args
处理多个位置参数,存储为元组
✅ **kwargs
处理多个关键字参数,存储为字典
✅ 两者可结合使用,提供灵活参数传递方式
掌握 *args
和 **kwargs
,让 Python 代码更灵活!