服务公告
蓝易云cdn:可变参数*args 和 kwargs详解
发布时间:2026-02-02 00:01
在 Python 里,*args 和 **kwargs 是两套“弹性入参机制”,用来把函数从“只能接固定参数”升级成“能兼容更多调用方、扩展更平滑”的可扩展接口。理解它们,你写库、写框架、写业务封装都会更稳更优雅 🚀
1) 核心定义:它们到底是什么?✅

*args:接收多余的位置参数,在函数内部表现为 tuple(元组)。**kwargs:接收多余的关键字参数,在函数内部表现为 dict(字典)。
def f(*args, **kwargs):
print(args, type(args))
print(kwargs, type(kwargs))
逐行解释:
def f(*args, **kwargs)::表示 f 可以接任意数量的位置/关键字参数。args:把调用时没被命名形参接住的“位置参数”打包成元组。kwargs:把调用时没被命名形参接住的“关键字参数”打包成字典。
2) *args 详解:专管“位置参数”📦
def add_all(*args):
total = 0
for x in args:
total += x
return total
add_all(1, 2, 3)
逐行解释:
def add_all(*args)::允许传入任意多个数字。for x in args::args是元组,可以遍历。total += x:累加每个位置参数。add_all(1,2,3):这里 1、2、3 都会进入args=(1,2,3)。
适用场景:聚合计算、日志收集、批量处理、API 兼容旧调用方式。
3) **kwargs 详解:专管“关键字参数”🧾
def build_user(**kwargs):
return {
"name": kwargs.get("name", "unknown"),
"age": kwargs.get("age", 0),
"extra": kwargs
}
build_user(name="Tom", age=18, city="Taipei")
逐行解释:
def build_user(**kwargs)::允许传入任意 key=value 参数。kwargs.get("name", "unknown"):没有传就用默认值,避免 KeyError。extra: kwargs:把剩余字段整体保留,适合“透传/扩展字段”。
适用场景:配置项、构建对象、HTTP 参数封装、插件化字段扩展。
4) 解包:* / ** 不止能“收”,还能“放” 🎯
4.1 列表/元组用 * 解包为位置参数
nums = [1, 2, 3]
print(add_all(*nums))
逐行解释:
*nums:把[1,2,3]拆成1,2,3传给函数。add_all(*nums):等价于add_all(1,2,3)。
4.2 字典用 ** 解包为关键字参数
data = {"name": "Tom", "age": 18}
print(build_user(**data))
逐行解释:
**data:把字典拆成name="Tom", age=18的形式传参。- 要求:字典的 key 必须是合法的参数名字符串。
5) 参数顺序规则:写错就语法报错(务必背熟)⚠️
函数形参从左到右通常是:
- 普通位置参数
*args(可变位置参数)- 仅限关键字参数(在
*之后声明的命名参数) **kwargs(可变关键字参数)
def demo(a, b, *args, c=0, **kwargs):
pass
逐行解释:
a, b:必须传的位置参数。*args:多余的位置参数进入 args。c=0:只能用关键字方式传(因为在*args后面)。**kwargs:多余关键字参数进入 kwargs(通常放最后)。
6) 真实工程用法:把参数“透传”给下游(封装常用套路)🛠️
def request_with_timeout(url, *args, timeout=3, **kwargs):
# 假设这里内部调用一个 request(url, ...) 的底层函数
return request(url, *args, timeout=timeout, **kwargs)
逐行解释:
*args, **kwargs:允许调用方继续传入底层函数支持的其它参数(例如 headers、params 等)。timeout=3:你在封装层强制加一个默认策略(提升稳定性)。request(..., timeout=timeout, **kwargs):把参数“原样透传”,同时覆盖/注入关键策略参数。
已经是第一篇啦!
下一篇: 服务器路由命令有哪些常用技巧?