人人都会AI编程

9.2 参数体系:位置参数、关键字参数、默认参数、可变参数、关键字仅限参数

更新时间:2026-07-12

Python 函数的参数体系极其灵活,理解并善用这些参数类型,可以让你的函数接口既简洁又强大。

位置参数

最基础的参数形式,调用时按顺序传入,实参和形参一一对应。

def greet(name, message):
    print(f"{name},{message}")

greet("小明", "你好")   # 输出:小明,你好

如果位置错乱,就会出现逻辑错误。当参数一多,纯粹依赖位置容易让调用方困惑。

关键字参数

调用时指明参数名,不依赖位置,可读性更高。

greet(message="你好", name="小明")  # 与位置无关,照样正确

混用规则:位置参数必须在关键字参数之前。

greet("小明", message="你好")   # 正确
greet(name="小明", "你好")     # 语法错误

默认参数

为参数提供缺省值,调用时可省略,简化常见用法的调用。

def greet(name, message="你好"):
    print(f"{name},{message}")

greet("小明")           # 输出:小明,你好
greet("小红", "恭喜")   # 输出:小红,恭喜

⚠️ 重大陷阱:默认参数的值只在函数定义时计算一次。如果默认值是可变对象(如列表、字典),多次调用会共享同一个对象,导致意外的累积效果。

def add_item(item, items=[]):
    items.append(item)
    return items

print(add_item(1))   # [1]
print(add_item(2))   # [1, 2]  不是 [2]!

正确做法:将默认值设为 None,在函数内部再创建新的可变对象。

def add_item(item, items=None):
    if items is None:
        items = []
    items.append(item)
    return items

可变参数

用于接收不定数量的实参,让函数更灵活。

  • *args:将多个位置参数打包成元组**。
  • kwargs(keyword arguments):将多个关键字参数打包成字典**。
def logall(*args, **kwargs):
    print("位置参数:", args)
    print("关键字参数:", kwargs)

logall(1, 2, 3, name="小明", age=20)
# 位置参数: (1, 2, 3)
# 关键字参数: {'name': '小明', 'age': 20}

拆包反向操作:用 * 把序列/字典展开成参数传入。

nums = [1, 2, 3]
info = {"name": "小明", "age": 20}
logall(*nums, **info)
# 效果等同于 logall(1, 2, 3, name='小明', age=20)

命名惯例argskwargs 只是约定俗成,你可用其他名字,但建议遵守以增强可读性。

关键字仅限参数

强制某些参数必须以关键字形式传递,这在 Python 3 中通过在 * 之后的参数实现。

def register(name, *, age, city):
    print(f"{name},{age}岁,来自{city}")

register("小明", age=20, city="北京")   # 正确
register("小明", 20, "北京")            # 错误,age和city只能用关键字传递

典型用途:当一个参数的意义不够明确,或者未来可能增加更多参数时,强迫调用方写出关键字,避免参数位置错乱。
可变参数 *args 后面的参数自动成为关键字仅限参数。

def demo(a, *args, b):
    pass
# b 只能以关键字形式传入

组合使用顺序

当你把以上所有类型放一起时,参数顺序必须是:

位置参数 → 默认参数 → *args → 关键字仅限参数 → **kwargs

一个完整的样例:

def f(a, b, c="默认", *args, d, e="默认2", **kwargs):
    pass
  • a, b:必传位置参数
  • c:有默认值的位置参数
  • *args:额外位置参数
  • d, e:关键字仅限参数(e 有默认值)
  • **kwargs:额外关键字参数

这些机制组合起来,能让你的 API 在保持简单调用的同时,又具备强大的扩展能力。