前言
大家好,我是倔强青铜三。欢迎关注我,微信公众号:倔强青铜三。欢迎点赞、收藏、关注,一键三连!!!
欢迎来到苦练Python第33天!
今天,我们把显微镜对准 Python 函数定义里两个不起眼的符号:/
与 *
。它们看似低调,却掌控着位置参数与关键字参数的生死大权。五分钟读完,包你不再写出一团浆糊的函数签名。
📌 为什么要用 /
和 *
?
- 在 Python 3.8 之前,想限定“只能按位置传”或“只能按关键字传”得靠约定。从 3.8 起,
/
和 *
被正式写入语法,强制隔离参数种类,提升可读性、兼容性与安全性。1️⃣ /
—— 左侧仅限位置参数
✅ 语法
def demo(a, b, /, c): ...
- 位于
/
左侧的 a
、b
只能按位置传值。位于 /
右侧的 c
不受限制,可位置也可关键字。🧪 实战示例
def greet(name, age, /, city): print(f"{name} is {age} years old, from {city}.")# ✅ 合法调用greet("Alice", 30, "New York")greet("Alice", 30, city="New York")# ❌ 非法调用greet(name="Alice", age=30, city="New York")# TypeError: greet() got some positional-only arguments passed as keyword arguments
2️⃣ *
—— 右侧仅限关键字参数
✅ 语法
def demo(*, x, y): ...
- 位于
*
右侧的 x
、y
只能按关键字传值。位于 *
左侧的参数不受限制。🧪 实战示例
def divide(a, *, b): return a / b# ✅ 合法调用divide(10, b=2)# ❌ 非法调用divide(10, 2)# TypeError: divide() takes 1 positional argument but 2 were given
3️⃣ /
和 *
同台竞技——全排列组合
✅ 终极模板
def full(a, b, /, c, d, *, e, f): ...
参数 | 传递方式 |
---|---|
a , b | 仅位置 |
c , d | 位置或关键字 |
e , f | 仅关键字 |
🧪 实战示例
def create_user(id, name, /, age, city=None, *, vip=False): print(id, name, age, city, vip)# ✅ 合法调用create_user(1001, "Tom", 18)create_user(1001, "Tom", 18, city="Shanghai")create_user(1001, "Tom", 18, city="Shanghai", vip=True)# ❌ 非法调用create_user(id=1001, name="Tom", age=18)# TypeError: create_user() got some positional-only arguments passed as keyword arguments
4️⃣ 常见误区与最佳实践
误区 | 正确姿势 |
---|---|
把 / 和 * 顺序写反 | 只能 / 在前 * 在后 |
想让所有参数都可关键字 | 不写 / |
想让所有参数都可位置 | 不写 * |
🧠 速记口诀
“斜杠左位,星右关键;斜星同框,顺序莫乱。”
🎯 今日练习
- 写一个
move(x, y, /, step=1, *, direction)
函数,只允许 x
、y
按位置传,direction
必须关键字传。用 /
+ *
改造你项目里最混乱的函数签名,让同事惊呼“专业”!最后感谢阅读!欢迎关注我,微信公众号:
倔强青铜三
。欢迎点赞
、收藏
、关注
,一键三连!!!