第 24 课 · 阶段四 · 函数与模块
函数参数进阶
参数是函数与外界的接口。这一课吃透位置参数、默认参数、关键字参数、*args 和 **kwargs 五种传参方式。
🎯 学完本课你将掌握
- 区分位置参数与关键字参数
- 使用默认参数提升函数友好度
- 用 *args 和 **kwargs 接收不定长参数
一、位置参数 vs 关键字参数
两种传参.py
1def info(name, age, city):2 print(f"{name} {age} {city}")34info("小明", 10, "广州") # 位置参数:按顺序5info(age=10, city="广州", name="小明") # 关键字参数:指名道姓6info("小红", city="深圳", age=12) # 混合:位置在前,关键字在后⚠️ 注意
混合使用时,位置参数必须写在关键字参数之前。
二、默认参数
默认参数.py
1def greet(name, msg="你好"):2 print(f"{msg},{name}")34greet("小明") # 你好,小明5greet("小红", "早上好") # 早上好,小红✅ 要点
默认参数让调用更灵活:不传就用默认值。注意默认参数要放在非默认参数之后。
三、*args:接收任意多个位置参数
*args.py
1def total(*args):2 print("收到参数:", args) # 是一个元组3 return sum(args)45print(total(1, 2, 3)) # 66print(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}")56show(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)67func(1, 2, 3, 4, 5, x=6, y=7)8# a,b: 1 29# c: 310# args: (4, 5)11# kwargs: {'x': 6, 'y': 7}💡 提示
顺序固定:位置参数 → 默认参数 → *args → **kwargs。日常很少需要全部组合,但读懂它就能看懂很多开源代码。
六、解包传参(星号反向使用)
解包传参.py
1def add3(a, b, c):2 return a + b + c34nums = [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(字典),组合顺序固定。星号既能收参数也能解包传参。函数参数这块通了,很多高级代码都能看懂了。