除了传统的位置匹配与默认参数外,Python还提供了关键字匹配可变参数匹配方式。
位置匹配与默认参数匹配可以缓和使用,但顺序有限制。
关键字匹配通过参数名匹配,可以改变匹配顺序。
可变参数匹配适于参数不确定的情况
几点说明:
位置匹配从左至右;
函数头部中*参数将传入的参数收集到元组,对应于调用时多个位置参数,**参数将传入的参数收集到字典,对应于调用时多个关键字参数
可变参数在函数头部使用时,表明函数可以接收任意多的参数(基于位置或关键字);
可变参数在函数调用时,表明分解参数集合,传递任意多的参数;
位置参数,关键字参数,*参数,**参数可以混用,但在函数头部时,有顺序要求:
从左只有依次为,位置参数,默认参数,*参数,**参数;
*参数,**参数在函数头部,调用时可以混用,但每种只可以出现一次
示例:
>>>def f(c, a=1, *b, **d):
print a, b, c, d
>>>f('I am "c"', 100, *('hello', 'world'), b=2, **{'type':2, 'name':['Python', 'r']}) # 分为两步,先分解,再合并,调用中**参数分解时相当于形成关键字参数,
100 ('hello', 'world') I am "c" {'b': 2, 'type': 2, 'name': ['Python', 'r']} # *参数相当于普通参数
>>>def f2(a, b, c, d, e):
print a, b, c, d, e
>>>f2(1, e = 5, *(2,), **{'c':3, 'd':4})
1 2 3 4 5
>>>f3(1, ('a', 'b', ))
1 (('a', 'b'),)
>>>f3(1, ('a', 'b', 'c'), 'alphabeta')
1 (('a', 'b', 'c'), 'alphabeta')
>>>def f4(*args):print args
>>>args = (1, 2, 3, 4)
>>>f4(args) # 只有一个元组参数,合并后作为函数收集参数形成的元组中的一个元素
((1, 2, 3,4),)
>>>f4(*args) # 先分解元组,再作为函数收集参数形成的元组中的元素
(1, 2, 3, 4)