最近学习python,看《Python基础教程》(第2版),发现函数定义里面有一个“收集参数”很有趣。
用户定义函数时,可以定义一个确定参数数量的函数,如:
>>> store(data, name1, name2, name3)
但是假如定义前不知道有多少个参数,该如何定义呢,C++和java中都有相应的解决方法,python中自然也有
def print_params(*params): print(params)
这里参数前面加上了星号*,即是不确定数量的参数,调用方式如下:
>>> print_params('Testing') ('Testing',) >>> print_params(1, 2, 3) (1, 2, 3) >>> print_params() ()
从上面的三个例子可以看出,使用*作为不确定数量参数,输入参数为元组类型
这种方法为啥叫收集参数呢?因为它收集所有其余位置参数,这样其实说明,它只能在参数末尾进行收集,而不能在开头或者中间收集
除了收集散列的参数,还可以收集key-value字典类型的参数,例如:
def print_params_3(**params): print(params)
调用方式:
>>> print_params_3(x=1, y=2, z=3) {'z': 3, 'x': 1, 'y': 2}
二者一起用:
print_params_4(x, y, z=3, *pospar, **keypar): print(x, y, z) print(pospar) print(keypar)
调用方式;
>>> print_params_4(1, 2, 3, 4, 5, 6, 7, foo=1, bar=2) 1 2 3 (5, 6, 7) {'foo' : 1, 'bar' : 2} >>> print_params_4(1,2) 1 2 3 () {}
参数收集的逆过程:
函数参数使用*号收集得到元组,使用**收集得到字典,那么反过来使用元组和字典可以作为函数参数
def add(x,y): return x+y
>>> params = (1, 2)
>>> add(*params)
3