python(3)-函数动态参数
先来看一段代码
def show(*arg): print(arg, type(arg)) if __name__ == "__main__": show(1) show(1,2,3,4,5)
现在执行一下,看看执行结果:
(1,) <class 'tuple'> (1, 2, 3, 4, 5) <class 'tuple'>
可以看到,程序输出了两个元组,但神奇的是函数可以接受一个参数,也可以接受很多个参数,这就是python的动态参数。
那么我们来想一想,给show()函数传递一个列表,那么执行结果是什么呢?
([1, 2, 3, 4, 5, 6, 7],) <class 'tuple'>
可以看到,show()函数将整个列表当作一个元组的元素进行输出了;再给它传递一个字典进去,试试看:
({1: 2, 2: 3},) <class 'tuple'>
把字典也当作了元组中的一个元素输出了,所以可以看出 *arg 将传入的所有参数都转换成了元组。
接下来,再来看一段代码,我们把 * 换成 **,先传递一个数字进去:
def show(**arg): print(arg, type(arg)) if __name__ == "__main__": show(n1=11,n2=22)
{'n2': 22, 'n1': 11} <class 'dict'>
可以看到,传递的参数被转换成了字典
总结一下:
* 将所有传入的元素转换成元组
** 将所有传入的元素转换成字典
把这两种参数放在一起使用试试
def show(*arg, **kwargs): print(arg, type(arg)) print(kwargs, type(kwargs)) if __name__ == "__main__": show(11,22,33,n1=11,n2=22) (11, 22, 33) <class 'tuple'> {'n1': 11, 'n2': 22} <class 'dict'>
这里有一点要注意的是:* 放在前面,**放在后面,顺序不可以错; 传递的参数也必须按照这个顺序,否则会报错。
那可不可以传列表和字典呢进去呢?
def show(*arg, **kwargs): print(arg, type(arg)) print(kwargs, type(kwargs)) if __name__ == "__main__": l = [11,22,33] d = {'n1':88, 'n2':99} show(*l, **d) (11, 22, 33) <class 'tuple'> {'n2': 99, 'n1': 88} <class 'dict'>
在列表名前面一定要加*, 在字典前面要加**