Python学习之路——形参中的:*args和**kwargs的用法和区别

*args 用来将参数打包成tuple给函数体调用
**kwargs 打包关键字参数成dict给函数体调用

*args用法

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

def foo(x,*args):
    print (x,args);

foo(1,2,3,4,5,6,7)
//运行结果为  (1, (2, 3, 4, 5, 6, 7))

从执行的结果中可以看出:1传给了x,而2,3,4,5,6,7则是传给了args,并且是以元祖的方式传递

当args和位置参数以及默认参数混合使用的情况
  • 基本原则是:先位置参数,默认参数,args(定义和调用都应遵循)
    一定要遵循基本原则,否则就会报错
def foo(x,y = 1,*args):
    print (x,y,args);

foo(1,2,3,4,5,6,7)
//运行结果为  (1, 2, (3, 4, 5, 6, 7))

从执行的结果中分析可以看出,x为1,y的值被重置为2,剩下的3,4,5,6,7都给了args

其中关于*,可以从2个角度来看(需要拆分来看):
  • 从形参的角度来看
//实际上是相当于 def foo(a,b,c,d):
def foo(*args):
    print (args)
//其中的1,2,3,4 都按照位置传值分别传给了a,b,c,d
foo(1,2,3,4)  
//执行的结果为 (1, 2, 3, 4)
  • 从实参的角度来看
def foo(a,b,c,d):
    print (a,b,c,d)
// 其中的*(1,2,3,4) 拆开来就是 foo(1,2,3,4) 都按照位置传值分别传给了a,b,c,d
foo(*(1,2,3,4))  
//执行的结果为 (1, 2, 3, 4)
**kwargs用法

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

def foo(a,**kwargs):
    print (a,kwargs)
// 1的值传给了a 将x=1,y=2,z=3以字典的方式传给了kwargs
foo(1,x=1,y=2,z=3)
//执行的结果为 (1, {'y': 2, 'x': 1, 'z': 3})
  • 关于**kwargs与位置参数、*args、默认参数混着用的问题:(注意顺序)
    基本原则:位置参数、*args、**kwargs三者的顺序必须是位置参数、*args、**kwargs,不然就会报错
def foo(a,*args,**kwargs):
    print (a,args,kwargs)
// 1传给了a 2,3,4以元祖的方式传给了args  x=5,y=6,z=7以字典的方式传给了kwargs
foo(1,2,3,4,x=5,y=6,z=7)
//执行的结果为 (1, (2, 3, 4), {'y': 6, 'x': 5, 'z': 7})
其中关于**,可以从2个角度来看(需要拆分来看)
  • 从形参的角度来看
 // 其实就相当于 def foo(x,y,z)
 def foo(**kwargs):
    print (kwargs)

foo(x=1,y=2,z=3)
//执行的结果为 {'y': 2, 'x': 1, 'z': 3}
  • 从实参的角度来看
def foo(a,b,c,d):
    print (a,b,c,d)
// **{"a":2,"b":3,"c":4,"d":5}是将字典的每个值按照关键字的方式传给a,b,c,d
foo(**{"a":2,"b":3,"c":4,"d":5})
// 执行的结果为 (2, 3, 4, 5)

猜你喜欢

转载自blog.csdn.net/changqi008/article/details/88983256