Python进阶第14天:深入解析函数中的*args与**kwargs灵活参数

欢迎来到100天Python学习挑战的第14天!今天我们将彻底解锁一个让Python函数极具灵活性的特性——*args 与 **kwargs。一旦掌握它们,你的函数就能像变形金刚一样,接收任意数量的参数,代码瞬间变得动态、可复用且功能强大。许多Python新手初次见到这两个符号时多少会感到困惑,但实际上它们的逻辑非常直观易懂。
今日速览
*args与**kwargs的基本概念- 何时使用以及如何使用
- 与常规参数混合使用的技巧
- 实战示例与应用场景
1. 什么是 *args?
*args 用于接收任意数量的位置参数,并自动将这些参数打包成一个元组(tuple)。让我们看一个简单的示例:
def add_numbers(*args):
total = sum(args)
print("Sum:", total)
add_numbers(1, 2)
add_numbers(10, 20, 30)
输出结果:
Sum: 3
Sum: 60
你可以像遍历普通列表一样逐个访问这些打包后的参数:
def show_args(*args):
for arg in args:
print(arg)
2. 什么是 **kwargs?
**kwargs 用于接收任意数量的关键字参数,并自动将这些参数打包成一个字典(dict)。参考下面的示例:
def print_info(**kwargs):
for key, value in kwargs.items():
print(f"{key}: {value}")
print_info(name="Alice", age=30, city="New York")
输出结果:
name: Alice
age: 30
city: New York
3. 同时使用两者
你可以在同一个函数中同时使用 *args 和 **kwargs,但顺序是固定的:*args 必须放在前面,**kwargs 放在后面。
def demo_function(*args, **kwargs):
print("Positional arguments:", args)
print("Keyword arguments:", kwargs)
demo_function(1, 2, 3, name="Alice", job="Engineer")
输出结果:
Positional arguments: (1, 2, 3)
Keyword arguments: {'name': 'Alice', 'job': 'Engineer'}
4. 默认参数 + 灵活参数
常规参数、*args 和 **kwargs 可以混合定义,只需要把常规参数放在最前面:
def send_email(to, subject, *attachments, **headers):
print("To:", to)
print("Subject:", subject)
print("Attachments:", attachments)
print("Headers:", headers)
send_email("user@example.com", "Meeting Notes", "file1.pdf", "file2.png", priority="high", read_receipt=True)
5. 用 * 与 ** 解包传参
这个技巧在实际开发中非常实用:你可以将一个列表或字典用 * 或 ** 快速展开,作为参数传递给函数。
def greet(name, age):
print(f"Hello {name}, you're {age} years old.")
info = {"name": "Bob", "age": 25}
greet(**info) # 字典解包为关键字参数
nums = [5, 10]
def multiply(x, y):
print(x * y)
multiply(*nums) # 列表解包为位置参数
实战:日志记录器
将学到的知识应用到一个真实的日志场景中:
def log_event(event_type, *args, **kwargs):
print(f"[{event_type.upper()}]")
for arg in args:
print(f"- Detail: {arg}")
for key, val in kwargs.items():
print(f"- {key}: {val}")
log_event("error", "File not found", "User logged out", filename="report.pdf", user="admin")
最佳实践
- ✅ 如果不确定位置参数的数量,优先使用
*args处理可变位置参数 - ✅ 如果需要接收任意关键字参数,使用
**kwargs来提升函数灵活性 - ✅ 建议为
args和kwargs起更具语义化的名称,例如*numbers、**options,增强代码可读性 - ⚠️ 灵活不等于随意——显式参数依然应优先使用,保持函数接口清晰易维护
今日复盘
*args用于收集多余的位置参数,打包为元组**kwargs用于收集多余的关键字参数,打包为字典- 两者可与常规参数灵活混用,并支持解包传参
- 实战场景:日志记录、灵活API接口等,一次掌握即可举一反三
