Python 函数参数的语法

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 函数参数你就已经完全吃透了!以后写库、框架、装饰器时就能随心所欲了。需要我再给你一些实际项目中常见的写法案例吗?

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值