在 Python 中定义函数时,有时会出现斜杠(/
)和星号(*
)这两种特殊的参数符号,斜杠(/
)和星号(*
)用于指定参数的传递方式,它们分别表示 仅限位置参数(Positional-Only Parameters) 和 仅限关键字参数(Keyword-Only Parameters)。
1. 斜杠 /
—— 仅限位置参数
-
含义:在
/
左侧的参数只能以位置参数(positional argument)的方式传递,不能使用关键字参数形式。 -
示例:
def func(a, b, /, c): return a + b + c func(1, 2, 3) # 正确:a=1, b=2, c=3 func(1, 2, c=3) # 正确:c 不受 / 影响,用关键字传递与否均可 func(a=1, b=2, c=3) # 错误:a 和 b 不能使用关键字传参
-
用途:通常用于避免 API 设计中的参数名冲突,或者强制某些参数必须按位置传递(如某些内置函数)。
2. 星号 *
—— 仅限关键字参数
-
含义:在
*
右侧的参数必须用关键字参数(keyword argument)的方式传递,不能按位置传递。 -
示例:
def func(a, *, b, c): return a + b + c func(1, b=2, c=3) # 正确:b 和 c 必须用关键字 func(a=1, b=2, c=3) # 正确:a 不受 * 影响,用关键字传递与否均可 func(1, 2, 3) # 错误:b 和 c 不能按位置传递
-
用途:提高代码可读性,强制某些参数显式命名,避免混淆。
3. 组合使用 /
和 *
-
示例(如内置的
sorted
函数):sorted(iterable, /, *, key=None, reverse=False)
iterable
是仅限位置参数(不能写成sorted(iterable=...)
)。key
和reverse
是仅限关键字参数(必须写成key=..., reverse=...
)。
-
调用示例:
sorted([3, 1, 2], key=lambda x: x) # 正确 sorted([3, 1, 2], lambda x: x, True) # 错误:key和reverse必须以关键字传递 sorted(iterable=[3, 1, 2], key=lambda x: x) # 错误:iterable 不能关键字传参
总结
符号 | 作用 | 示例 |
---|---|---|
/ | 左侧参数仅限位置 | def f(a, /, b): ... |
* | 右侧参数仅限关键字 | def f(a, *, b): ... |
组合1 | / 和* 之间无其他参数 | sorted(iterable, /, *, key, reverse) |
组合2 | / 和* 之间还有其他参数 | def f(a, b, /, c, *, d) c 不受/ 和* 影响,按位置或关键字传递均可 |