*args和**kwargs(不定长参数)

多个实参,放到一个元组里面,以“*”开头,可以传递多个参数;**是形参中按照关键字传值把多余的值以字典的方式呈现。

*args

表示的就是将实参中按照位置传值,多出来的值都给args,且以元组的方式呈现。

def foo(x,*args):
    print(x)
    print(args)
 
foo(1,2,3,4,5)#其中的2,3,4,5都给了args

执行结果:

1
(2, 3, 4, 5)

当args与位置参数和默认参数混合使用情况在(注意三者的顺序)

实例一

三者顺序是:位置参数、默认参数、*args

def foo(x,y=1,*args):
    print(x)
    print(y)
    print(args)
 
foo(1,2,3,4,5)#其中的x为1,y=1的值被2重置了,3,4,5都给了args


# 执行结果
1
2
(3, 4, 5)

实例二

三者顺序:位置参数、*args、默认参数

def foo(x,*args,y=1):
    print(x)
    print(args)
    print(y)
 
foo(1,2,3,4,5)#其中的x为1,2,3,4,5都给了args,y按照默认参数依旧为1


# 执行结果
1
(2, 3, 4, 5)
1

其中关于“*”,可以从两个家督来看(需要拆分来看):

1.从形参角度来看:

def foo(*args):#其实这一操作相当于def foo(a,b,c,d,e):
    print(args)
foo(1,2,3,4,5)#其中的1,2,3,4,5都按照位置传值分别传给了a,b,c,d,e


# 执行结果
(1, 2, 3, 4, 5)

2.从实参的角度来看:

def foo(x,y,z):
    print(x)
    print(y)
    print(z)
     
foo(*(1,2,3))#其中的*(1,2,3)拆开来看就是:foo(1,2,3),都按照位置传值分别传给了x,y,z


# 执行结果
1
2
3 

**kwargs

表示的就是形参中按照关键字传值把多余的传值以字典的方式呈现

def foo(x,**kwargs):
    print(x)
    print(kwargs)
foo(1,y=1,a=2,b=3,c=4)#将y=1,a=2,b=3,c=4以字典的方式给了kwargs


# 执行结果
1
{'y': 1, 'a': 2, 'b': 3, 'c': 4}

关于**kwargs与位置参数、*args、默认参数混合使用情况(注意顺序)

位置参数、*args、**kwargs三者的顺序必须是位置参数、*args、**kwargs,不然会报错:

def foo(x,*args,**kwargs):
    print(x)
    print(args)
    print(kwargs)
foo(1,2,3,4,y=1,a=2,b=3,c=4)#将1传给了x,将2,3,4以元组方式传给了args,y=1,a=2,b=3,c=4以字典的方式给了kwargs


# 执行结果
1
(2, 3, 4)
{'y': 1, 'a': 2, 'b': 3, 'c': 4}

错误示例(由于顺序错误)

def foo(x,**kwargs,*args):
    print(x)
    print(args)
    print(kwargs)
foo(1,y=1,a=2,b=3,c=4,2,3,4)


# 执行结果
# SyntaxError: invalid syntax

位置参数、默认参数、**kwargs三者的顺序必须是位置参数、默认参数、**kwargs、不然会报错:

def foo(x,y=1,**kwargs):
    print(x)
    print(y)
    print(kwargs)
foo(1,a=2,b=3,c=4)#将1按照位置传值给x,y按照默认参数为1,a=2,b=3,c=4以字典的方式给了kwargs


# 执行结果
1
1
{'a': 2, 'b': 3, 'c': 4}

其中关于“**”,可以从两个角度来看(需要拆分来看):

1.从形参的角度来看:

def foo(**kwargs):#其实就是相当于def foo(y,a,b,c)
    print(kwargs)
foo(y=1,a=2,b=3,c=4)


# 执行结果
{'y': 1, 'a': 2, 'b': 3, 'c': 4}

2.从实参的角度来看:

def foo(a,b,c,d):
    print(a)
    print(b)
    print(c)
    print(d)
foo(**{"a":2,"b":3,"c":4,"d":5})#**{"a":2,"b":3,"c":4,"d":5}是将字典里的每个值按照关键字传值的方式传给a,b,c,d


# 执行结果
2
3
4
5
def foo(a,b,c,d=1):
    print(a)
    print(b)
    print(c)
    print(d)
foo(**{"a":2,"b":3,"c":4})#**{"a":2,"b":3,"c":4}是将字典里的每个值按照关键字传值的方式传给a,b,c;d依旧按照默认参数


# 执行结果
2
3
4
1

 

posted @ 2018-10-13 09:21  小黑_9527  阅读(835)  评论(0编辑  收藏  举报