Python------*args和**kwargs

总结:

  1. *args
    首先时把位置传值的参数传递完成后,多余的参数会被存储为一个元组,之后的默认参数无法按位置传值,除非使用指定参数传值。
  2. **kwargs
    首先时把位置传值的参数和指定位置传值传递完成,多余指定位置传值的参数会被存储为一个数组传递

在阅读代码的时候,我们常常会遇到这两个东西,那么我们看看到底是什么东西吧。
*args:表示实参按位置传值,而多余的未指定形参名称的值传递给了*args,并且以元组的方式呈现。

def king(perv,last,*group):
    print(perv)
    print(last)
    print(group)

if __name__ == '__main__':
    king("a",4,5,"3",{"1":1,2:2})

#output:
#a
#4
#(5, '3', {'1': 1, 2: 2})

当*args混用默认参数时:

def king1(perv,last=1000,*group):
    print('king1')
    print(perv)
    print(last)
    print(group)
def king2(perv,*group,last=1000):
    print('king2')
    print(perv)
    print(last)
    print(group)
if __name__ == '__main__':
    king1("a",4,5,"3",{"1":1,2:2})
    king2("a",4,5,"3",{"1":1,2:2})

#output:
#king1
#a
#4
#(5, '3', {'1': 1, 2: 2})
#king2
#a
#1000
#(4,5, '3', {'1': 1, 2: 2})

表明默认参数的值被覆盖了。当遇到king2()这种情况时,我们需要这么调用就行了king2("a",4,5,"3",{"1":1,2:2},last=1),注意last=要放在后面。
因此我们可以总结出两种方式使用:

  1. 作为形参
def king(*group):
    print(group)
if __name__ == '__main__':
    king("a",4,5,"3",{"1":1,2:2})
#output:
#(4,5, '3', {'1': 1, 2: 2})
  1. 作为实参
def king(a,b,c):
    print(group)
if __name__ == '__main__':
    king(*("a",4,5))
#output:
#a
#4
#5

**kwargs:表示就是形参中按关键字传值吧多余的值以字典的方式呈现。

def king(x,**kwargs):
     print(x)
     print(kwargs)
if __name__ == '__main__':
    king("a",z=5,y=4)
#output:
#a
#{'z': 5, 'y': 4}
#

注意不能在调用时用x=,否则会使得x赋值了两次而报错。
混用默认参数:

def king(x,y=100,**kwargs):
     print(x)
     print(y)
     print(kwargs)
if __name__ == '__main__':
    king("a",z=5,y=4)
#output:
#a
#4
#{'z': 5}

因此可以看见这个是把多余的指定参数以字典的方式存储到了kwargs
因此我们可以总结出两种方式使用:

  1. 作为形参
def king(**kwargs):
    print(kwargs)
if __name__ == '__main__':
    king(a="a",b=4,c=5,d={"1":1,2:2})
#output:
#{'a': 'a', 'b': 4, 'c': 5, 'd': {'1': 1, 2: 2}}
  1. 作为实参
def king(a,b,c,d):
    print(a)
    print(b)
    print(c)
    print(d)

if __name__ == '__main__':
    king(**{'a':1,'b':10,'c':100,'d':1000})
#output:
#1
#10
#100
#1000

你可能感兴趣的:(Python------*args和**kwargs)