第 24 课 · 阶段四 · 函数与模块

函数参数进阶

参数是函数与外界的接口。这一课吃透位置参数、默认参数、关键字参数、*args 和 **kwargs 五种传参方式。

第 24 课阶段四 · 函数与模块难度:进阶建议时长:35 分钟关键词:默认参数 · *args · **kwargs

🎯 学完本课你将掌握

  • 区分位置参数与关键字参数
  • 使用默认参数提升函数友好度
  • 用 *args 和 **kwargs 接收不定长参数

一、位置参数 vs 关键字参数

两种传参.py
1def info(name, age, city):
2 print(f"{name} {age} {city}")
3
4info("小明", 10, "广州") # 位置参数:按顺序
5info(age=10, city="广州", name="小明") # 关键字参数:指名道姓
6info("小红", city="深圳", age=12) # 混合:位置在前,关键字在后
⚠️ 注意
混合使用时,位置参数必须写在关键字参数之前

二、默认参数

默认参数.py
1def greet(name, msg="你好"):
2 print(f"{msg},{name}")
3
4greet("小明") # 你好,小明
5greet("小红", "早上好") # 早上好,小红
✅ 要点
默认参数让调用更灵活:不传就用默认值。注意默认参数要放在非默认参数之后。

三、*args:接收任意多个位置参数

*args.py
1def total(*args):
2 print("收到参数:", args) # 是一个元组
3 return sum(args)
4
5print(total(1, 2, 3)) # 6
6print(total(1, 2, 3, 4, 5)) # 15

四、**kwargs:接收任意多个关键字参数

**kwargs.py
1def show(**kwargs):
2 print(kwargs) # 是一个字典
3 for k, v in kwargs.items():
4 print(f"{k} = {v}")
5
6show(name="小明", age=10, city="广州")

五、完整版:四种参数组合

组合顺序.py
1def func(a, b, c=10, *args, **kwargs):
2 print("a,b:", a, b)
3 print("c:", c)
4 print("args:", args)
5 print("kwargs:", kwargs)
6
7func(1, 2, 3, 4, 5, x=6, y=7)
8# a,b: 1 2
9# c: 3
10# args: (4, 5)
11# kwargs: {'x': 6, 'y': 7}
💡 提示
顺序固定:位置参数 → 默认参数 → *args → **kwargs。日常很少需要全部组合,但读懂它就能看懂很多开源代码。

六、解包传参(星号反向使用)

解包传参.py
1def add3(a, b, c):
2 return a + b + c
3
4nums = [1, 2, 3]
5print(add3(*nums)) # 6 列表拆开传
6d = {"a": 1, "b": 2, "c": 3}
7print(add3(**d)) # 6 字典按键传

七、常见错误与解决

常见错误与解决

错误现象原因 / 解决方法
SyntaxError: non-default argument follows default默认参数后跟了非默认参数,把有默认值的都放后面。
多个值给同一参数TypeError: got multiple values for argument 'x',位置和关键字传了同一个参数。
*args 里不能指定名*args 只能接位置参数;想要带名不定长用 **kwargs。
✍️ 小练习
写一个函数 compute(operation, *nums):传入"sum"就求和、"max"就取最大、"avg"就取平均。
📌 本节小结
五种传参:位置、关键字、默认、*args(元组)、**kwargs(字典),组合顺序固定。星号既能收参数也能解包传参。函数参数这块通了,很多高级代码都能看懂了。