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'>

在列表名前面一定要加*, 在字典前面要加**

posted @ 2016-02-04 14:32  黄小墨  阅读(1575)  评论(0编辑  收藏  举报