在函数的传递参数的时候,有的时候需要传递不定长度的参数,这时候可以使用*args 和**kwargs,*args 没有key值,**kwargs有key值

这在工作中比如需要选择下载哪些东西,但是下载的个数都不确定,那么可以使用这种可变长参数来传递值,用户输入多少那么就有多少

*args 实际上是一个元组的形式来传递的,而**kwargs则是一个字典的形式来传递的

#coding:utf-8

def function(a,b,*args):
    print a,b
    print args

if __name__ == '__main__':
    function('a','b','c','d','e','f','g')

输出:
a b
('c', 'd', 'e', 'f', 'g')

在参数的传递时,以上可以看到c之后的参数全部为一个元组包裹起来来传递,且在函数中args是一个元组类型的值

当可变长参数前没有形参,那么所有的传递的参数就是一个元组

def function(*args):
    print args

if __name__ == '__main__':
    function('a','b','c','d','e','f','g')

输出:
('a', 'b', 'c', 'd', 'e', 'f', 'g')

def function(info):
    print info

if __name__ == '__main__':
    info = ('a','b','c','d','e','f','g')
    function(info)

输出:
('a', 'b', 'c', 'd', 'e', 'f', 'g')

这两种方式均可以实现一样的效果

当然反过来也是可以的

def function(a,b,c,d,e,f,g):
    print a,b,c,d,e,f,g

if __name__ == '__main__':
    info = ('aa','bb','cc','dd','ee','ff','gg')
    function(*info)
def function(a,b,c,d,e,f,g):
    print a,b,c,d,e,f,g

if __name__ == '__main__':
    info = ('cc','dd','ee','ff','gg')
    function('aa','bb',*info)

字典类型的可变长参数的传递

def function(a,b,**kwargs):
    print a,b
    print kwargs

if __name__ == '__main__':
    function('a','b',c='1',d=2,e=3,f=4)

输出:
a b
{'c': '1', 'e': 3, 'd': 2, 'f': 4}
def function(**kwargs):
    for i in kwargs:
        print i,':',kwargs[i]

if __name__ == '__main__':
    info = {'c':'1','d':2,'e':3,'f':4}
    function(**info)

输出:
c : 1
e : 3
d : 2
f : 4

使用直接传递一个参数,但是这个参数是元组,在函数内再将其拆分,这样参数的传递显得更为整洁

def function(info):
    ip,user,password,port=info
    print ip
    print user
    print password
    print port
    
if __name__ == '__main__':
    info = '192.168.99.88','admin','admin',22
    function(info)
def function(info):
    for i in info:
        print i,":",info[i]

if __name__ == '__main__':
    info = {'ip':'192.168.99.88','user':'admin','password':'admin','port':22}
    function(info)

输出:
ip : 192.168.99.88
password : admin
user : admin
port : 22