前言
大家好,我是倔强青铜三 。欢迎关注我,微信公众号:倔强青铜三。欢迎点赞、收藏、关注,一键三连!!!
欢迎来到苦练Python第33天!
今天,我们把显微镜对准 Python 函数定义里两个不起眼的符号:/
与 *
。它们看似低调,却掌控着位置参数 与关键字参数的生死大权。五分钟读完,包你不再写出一团浆糊的函数签名。
📌 为什么要用 /
和 *
?
- 在 Python 3.8 之前,想限定"只能按位置传"或"只能按关键字传"得靠约定。
- 从 3.8 起,
/
和*
被正式写入语法,强制隔离参数种类,提升可读性、兼容性与安全性。
1️⃣ /
------ 左侧仅限位置参数
✅ 语法
python
def demo(a, b, /, c):
...
- 位于
/
左侧 的a
、b
只能按位置传值。 - 位于
/
右侧 的c
不受限制,可位置也可关键字。
🧪 实战示例
python
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️⃣ *
------ 右侧仅限关键字参数
✅ 语法
python
def demo(*, x, y):
...
- 位于
*
右侧 的x
、y
只能按关键字传值。 - 位于
*
左侧的参数不受限制。
🧪 实战示例
python
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️⃣ /
和 *
同台竞技------全排列组合
✅ 终极模板
python
def full(a, b, /, c, d, *, e, f):
...
参数 | 传递方式 |
---|---|
a , b |
仅位置 |
c , d |
位置或关键字 |
e , f |
仅关键字 |
🧪 实战示例
python
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
必须关键字传。 - 用
/
+*
改造你项目里最混乱的函数签名,让同事惊呼"专业"!
最后感谢阅读!欢迎关注我,微信公众号 :
倔强青铜三
。欢迎点赞
、收藏
、关注
,一键三连!!!