在 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 + c
nums = [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 代码更灵活!

952

被折叠的 条评论
为什么被折叠?



