实参
- '''
- 位置实参: 不用明确形参名的传参方式, 一定按照位置给形参传值
- 关键字实参: 必须明确形参名字与值为形参传值, 可以不用按照位置
- *****
- 注: 混用
- 1. 关键字实参必须出现在位置实参后
- 2. 多个位置实参还是按照位置传参
- 3. 关键字实参为没有从位置实参拿到值的形参传值, 可以不用按照指定顺序
- '''
- def fn2(a, b, c, d, e, f):
- print(a, b, c, d, e, f)
- fn2(10, 20, 30, e=100, f=500, d=200)
位置形参的范畴
位置形参
- # positional argument
- def fn(a, b, c):
- print(a, b, c)
- # 位置形参可以由 位置实参 与 关键字实参 来传值
- fn(10, 20, 30)
- fn(a=10, b=20, c=30)
默认形参
- def fn(a=10,b=20):
- print(a, b)
- # 默认形参可以由 位置实参 与 关键字实参 来传值, 还可以不用传值 (采用自身默认值)
- fn()
- fn(20, 30)
- fn(a=200, b=300)
- fn(100) # 就给 a 传
- fn(b=100) # 就给 b 传
- # 混用
- # 位置形参与默认形参同时存在, 默认形参必须在后
- def fn1(a,b,c=10,d=20):
- print(a, b, c, d)
- # 位置形参必须传值, 默认形参分情况传值
- fn1(100, 200, d=1000)
可变长形参
- # 可变长形参会以 元组 形式接受 位置形参与默认形参未接受完的 所有传入的位置实参, 用索引来取第几个
- # 可变长形参只能由 位置实参 来传值 *****
- def fn(a, b=10, *args):
- print(a, b)
- print(args)
- # 小细节: 可变长形参只能接受位置实参的值, 位置实参还必须在关键字实参前,
- # 导致默认形参只能由位置实参来传值
- fn(1, 20, 100, 200) # 1 给 a 20 给 b, 不能用 b=20 传 100,200 给 args
关键字形参范畴
- # 前提: 出现在 * 之后的形参
- def fn(a, b=10, *, c, d=20, e):
- pass
- # c,d,e 都是出现在 * 之后, 都是关键字形参, 由于必须由 关键字实参 来传值, 没有顺序的强行要求
- # 可变长关键字形参: 用来接收没有被关键字形参接收完的关键字形参, 也只能由关键字实参来传值
- # 用字典来存放数据
- def fn(**kwargs):
- print(kwargs)
- fn(a=10,b=20) # {'a': 10, 'b': 20}
- dic = {'x': 100, 'y': 200}
- fn(**dic) # {'x': 100, 'y': 200}
参数总结
- def fn(a, b, c=10, *args, d, e=20, f, **kwargs):
- pass
- # 位置形参: a,b
- # 默认形参: c
- # 可变长位置形参: args
- # 无初值关键字形参: d,f
- # 有初值关键字形参: e
- # 可变长关键字参数: kwargs
- # 1. 位置形参与默认形参: 能用 位置实参 关键字实参 传值
- # 2. 可变长位置形参: 只能 位置实参 传值
- # 3. 所以关键字形参: 只能 关键字实参 传值
来源: http://www.bubuko.com/infodetail-3092578.html