Python收集参数完全指南:掌握*args和**kwargs的用法
什么是收集参数?
在Python中,收集参数是一种特殊的函数参数声明方式,允许函数接收任意数量的参数。主要包含两种形式:
*args
:收集任意数量的位置参数**kwargs
:收集任意数量的关键字参数
1. *args 的使用方法
*args
将接收到的所有位置参数打包成一个元组:
def sum_numbers(*args):
total = 0
print("参数类型:", type(args)) # <class 'tuple'>
for num in args:
total += num
return total
print(sum_numbers(1, 2, 3)) # 输出: 6
print(sum_numbers(10, 20, 30, 40)) # 输出: 100
特点:
- 参数名前加单个星号
*
- 接收的参数被存入元组
- 函数调用时使用位置参数传递
2. **kwargs 的使用方法
**kwargs
将接收到的关键字参数打包成一个字典:
def print_user(**kwargs):
print("参数类型:", type(kwargs)) # <class 'dict'>
for key, value in kwargs.items():
print(f"{key}: {value}")
print_user(name="Alice", age=30, job="Engineer")
# 输出:
# name: Alice
# age: 30
# job: Engineer
特点:
- 参数名前加双星号
**
- 接收的参数被存入字典
- 函数调用时使用关键字参数传递
3. 组合使用 *args 和 **kwargs
在函数中同时使用两种收集参数时,必须遵守顺序:
def combined_example(name, *args, **kwargs):
print(f"固定参数: {name}")
print(f"位置参数: {args}")
print(f"关键字参数: {kwargs}")
combined_example("Bob", 1, 2, 3, city="Beijing", country="China")
# 输出:
# 固定参数: Bob
# 位置参数: (1, 2, 3)
# 关键字参数: {'city': 'Beijing', 'country': 'China'}
参数顺序规则:
- 普通位置参数
*args
收集参数- 普通关键字参数
**kwargs
收集参数
4. 实际应用场景
场景1:函数装饰器
def logger(func):
def wrapper(*args, **kwargs):
print(f"调用函数: {func.__name__}")
return func(*args, **kwargs)
return wrapper
@logger
def add(a, b):
return a + b
add(5, 3) # 输出: 调用函数: add
场景2:参数透传
class Database:
def query(self, sql, *params, **options):
print(f"执行SQL: {sql}")
print(f"参数: {params}")
print(f"选项: {options}")
db = Database()
db.query("SELECT * FROM users", "arg1", "arg2", timeout=10, cache=True)
5. 注意事项
- 参数名
args
和kwargs
只是约定俗成,可使用其他名称 *args
必须出现在**kwargs
之前- 不能单独使用
*
作为参数名 - 字典解包时键必须是字符串且符合变量名规则
发表评论