最近学习 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
来源: http://www.bubuko.com/infodetail-2879986.html