Python------*args和**kwargs
2018-06-14 本文已影响0人
尼古拉苏
总结:
- *args
首先时把位置传值的参数传递完成后,多余的参数会被存储为一个元组,之后的默认参数无法按位置传值,除非使用指定参数传值。 - **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=要放在后面。
因此我们可以总结出两种方式使用:
- 作为形参
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})
- 作为实参
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
因此我们可以总结出两种方式使用:
- 作为形参
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}}
- 作为实参
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