Python 函数参数的语法非常灵活,支持多种写法,基本上可以满足所有常见场景。下面我把 Python(3.8+ 主流版本)中所有参数种类和组合规则一一详细介绍,并附上示例和注意事项。
1. 位置参数(Positional Arguments)
最基本的参数,必须按顺序传入。
def func(a, b, c):
print(a, b, c)
func(1, 2, 3) # 正确
func(1, 2) # 错误,缺少 c
2. 关键字参数(Keyword Arguments)
调用时可以用 参数名=值 的形式,打乱顺序也没问题。
func(a=1, c=3, b=2) # 正确,顺序随意
3. 默认参数(Default Arguments)
定义时可以给参数设定默认值,调用时可以不传。
def func(a, b=10, c=20):
print(a, b, c)
func(1) # 1 10 20
func(1, 2) # 1 2 20
func(1, 2, 3) # 1 2 3
注意:默认参数必须放在位置参数后面!
4. 可变位置参数(*args)
收集多余的位置参数成元组。
def func(a, b, *args):
print(a, b)
print(args) # 剩余位置参数组成的元组
func(1, 2) # args = ()
func(1, 2, 3, 4, 5) # args = (3, 4, 5)
5. 仅限位置参数(Positional-Only Parameters,Python 3.8+)
用 / 之前的参数只能通过位置传,不能用关键字。
def func(a, b, /, c, d):
print(a, b, c, d)
func(1, 2, 3, 4) # 正确
func(1, 2, c=3, d=4) # 正确
func(a=1, b=2, c=3, d=4)# 错误!a、b 不能用关键字
典型例子:print()、len() 这些内置函数很多参数就是仅限位置的。
6. 可变关键字参数(**kwargs)
收集多余的关键字参数成字典。
def func(a, b=10, **kwargs):
print(a, b)
print(kwargs)
func(1, x=100, y=200, z=300)
# 输出:
# 1 10
# {'x': 100, 'y': 200, 'z': 300}
7. 仅限关键字参数(Keyword-Only Parameters)
放在 * 或 *args 之后的参数,必须用关键字方式传入。
def func(a, *, b, c=30): # b 和 c 是仅限关键字参数
print(a, b, c)
func(1, b=2) # 正确
func(1, b=2, c=3) # 正确
func(1, 2) # 错误!b 必须用关键字
8. 组合全部语法(终极形式)
Python 允许把所有特性组合起来,顺序必须严格遵守:
def func(
pos1, pos2, # 普通位置参数
/, # / 之前都是仅限位置
standard, # 普通参数(可位置可关键字)
*, # * 之后都是仅限关键字
key_only1, # 仅限关键字
key_only2=50, # 带默认值的仅限关键字
**kwargs # 收集剩余关键字参数
):
...
完整顺序规则(必须严格遵守):
(仅限位置参数) , 可选的 *args , (仅限关键字参数) , 可选的 **kwargs
| | | |
用 / 分隔 用 * 分隔 可以有默认值 最后
最完整的合法写法示例(Python 3.8+):
def ultimate(
a, b, # 普通位置参数
/, # 以下不能用关键字
c, d=40, # 普通参数(位置或关键字皆可)
*args, # 可变位置参数
e, f=50, # 仅限关键字参数(必须用关键字传)
**kwargs # 可变关键字参数
):
print(f"a={a}, b={b}, c={c}, d={d}")
print(f"args={args}")
print(f"e={e}, f={f}")
print(f"kwargs={kwargs}")
# 调用示例
ultimate(1, 2, 3, 4, 5, 6, e=7, f=8, x=9, y=10)
# 输出:
# a=1, b=2, c=3, d=4
# args=(5, 6)
# e=7, f=8
# kwargs={'x': 9, 'y': 10}
9. 参数解包(调用时使用 * 和 **)
调用函数时也可以用 * 和 ** 解包列表/元组和字典:
def f(a, b, c):
print(a, b, c)
nums = [1, 2, 3]
f(*nums) # 等价于 f(1, 2, 3)
kwargs = {'a': 10, 'b': 20, 'c': 30}
f(**kwargs) # 等价于 f(a=10, b=20, c=30)
总结表格
| 语法 | 含义 | 传入方式 | 出现位置要求 |
|---|---|---|---|
param | 普通参数 | 位置或关键字 | 任意 |
param=value | 默认参数 | 可省略 | 必须在普通位置参数之后 |
*args | 可变位置参数 | 位置 | 在所有位置/普通参数之后 |
**kwargs | 可变关键字参数 | 关键字 | 必须放在最后 |
param, / | 仅限位置参数 | 只能位置 | / 之前 |
*, param | 仅限关键字参数 | 只能关键字 | * 或 *args 之后 |
掌握了上面这些,Python 函数参数你就已经完全吃透了!以后写库、框架、装饰器时就能随心所欲了。需要我再给你一些实际项目中常见的写法案例吗?
5139

被折叠的 条评论
为什么被折叠?



