一、可变参数基础概念
1.1 什么是可变参数
可变参数是Python函数定义中用于接收不定数量参数的机制,主要分为两种形式:
*args
:接收任意数量的位置参数(positional arguments)**kwargs
:接收任意数量的关键字参数(keyword arguments)
def variable_args(*args, **kwargs):
print("位置参数:", args)
print("关键字参数:", kwargs)
variable_args(1, 2, 3, name="Alice", age=25)
输出:
位置参数: (1, 2, 3)
关键字参数: {'name': 'Alice', 'age': 25}
1.2 参数解包与收集
Python使用星号(*
)和双星号(**
)实现了两种操作:
- 参数收集:在函数定义时,将传入的参数收集到元组或字典中
- 参数解包:在函数调用时,将序列或映射解包为单独的参数
二、*args的深入解析
2.1 基本用法
*args
允许函数接收任意数量的位置参数,这些参数会被收集到一个元组中:
def sum_numbers(*args):
print("参数类型:", type(args)) # <class 'tuple'>
return sum(args)
print(sum_numbers(1, 2, 3, 4)) # 输出: 10
2.2 使用场景
- 实现可变参数函数:如内置的
print()
、max()
等函数 - 包装/代理函数:将参数原样传递给另一个函数
- 参数预处理:在调用实际功能前对参数进行处理
2.3 高级技巧
2.3.1 与普通参数组合使用
def make_pizza(size, *toppings):
print(f"制作一个{
size}英寸的披萨,配料有:")
for topping in toppings:
print(f"- {
topping}")
make_pizza(12, 'pepperoni', 'mushrooms', 'extra cheese')
2.3.2 强制关键字参数
在*args
后面定义的参数必须使用关键字传递:
def func(a, b, *args, option=True):
pass
func(1, 2, 3, 4) # option使用默认值
func(1, 2, 3, option=False) # 显式设置option
三、**kwargs的深入解析
3.1 基本用法
**kwargs
收集所有未明确匹配的关键字参数到一个字典中:
def person_info(**kwargs):
for key, value in kwargs.items():
print(f"{
key}: {
value}")
person_info(name="Alice", age=25, city="New York")
3.2 使用场景
- 配置选项处理:接受各种配置参数
- 函数包装:动态传递参数给底层函数
- 类继承:在子类中处理父类不需要的额外参数
3.3 高级技巧
3.3.1 参数过滤
def process_data(**kwargs):
valid_keys = ['name', 'age', 'email']
filtered = {
k: v for k, v in kwargs.items() if k in valid_keys}
print("过滤后的参数:", filtered)
process_data(name="Bob", age=30, city="Paris", email="[email protected]")
3.3.2 参数合并
def update_config(defaults, **overrides):
return {
**defaults, **overrides}
default_settings = {
'color': 'red', 'size': 'medium'}
new_settings = update_config(default_settings, size='large', brightness=0.8)
四、参数解包技巧
4.1 调用时的参数解包
def draw_point(x, y