苦练Python第14天:Python函数中的*args与**kwargs解析
作者:Rahul Gupta
译者:倔强青铜三
前言
大家好,我是倔强青铜三 。是一名热情的软件工程师,我热衷于分享和传播IT技术,致力于通过我的知识和技能推动技术交流与创新,欢迎关注我,微信公众号:倔强青铜三。欢迎点赞、收藏、关注,一键三连!!!
欢迎来到 100天Python挑战 的第14天!
今天,我们解锁 灵活参数 的魔法------*args
与 **kwargs
。它们让你的函数 想接多少参数就接多少,代码瞬间动态、可复用又强大。
今日速览
*args
与**kwargs
是什么- 何时使用、如何使用
- 与常规参数混用技巧
- 实战示例
🧠 1. 什么是 *args
?
*args
接收任意数量的 位置参数 ,打包成 tuple。
python
def add_numbers(*args):
total = sum(args)
print("Sum:", total)
add_numbers(1, 2)
add_numbers(10, 20, 30)
输出:
makefile
Sum: 3
Sum: 60
像列表一样遍历:
python
def show_args(*args):
for arg in args:
print(arg)
🧠 2. 什么是 **kwargs
?
**kwargs
接收任意数量的 关键字参数 ,打包成 dict。
python
def print_info(**kwargs):
for key, value in kwargs.items():
print(f"{key}: {value}")
print_info(name="Alice", age=30, city="New York")
输出:
vbnet
name: Alice
age: 30
city: New York
🧪 3. 同时使用两者
可在同一函数内并用,顺序固定:*args
在前。
python
def demo_function(*args, **kwargs):
print("Positional arguments:", args)
print("Keyword arguments:", kwargs)
demo_function(1, 2, 3, name="Alice", job="Engineer")
输出:
matlab
Positional arguments: (1, 2, 3)
Keyword arguments: {'name': 'Alice', 'job': 'Engineer'}
✨ 4. 默认参数 + 灵活参数
混合常规参数、*args
与 **kwargs
:
python
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. 用 *
与 **
解包传参
把列表或字典一次性展开:
python
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) # 列表解包为位置参数
🎯 实战:日志记录器
python
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 等场景一次掌握
最后感谢阅读!欢迎关注我,微信公众号 :
倔强青铜三
。欢迎点赞
、收藏
、关注
,一键三连!!!