Python中 *args 和 **kwargs 的区别

先来看个例子:

def foo(*args, **kwargs):
    print 'args = ', args
    print 'kwargs = ', kwargs
    print '---------------------------------------'

if __name__ == '__main__':
    foo(1,2,3,4)
    foo(a=1,b=2,c=3)
    foo(1,2,3,4, a=1,b=2,c=3)
    foo('a', 1, None, a=1, b='2', c=3)

输出结果如下:

args =  (1, 2, 3, 4) 
kwargs =  {} 
--------------------------------------- 
args =  () 
kwargs =  {'a': 1, 'c': 3, 'b': 2} 
--------------------------------------- 
args =  (1, 2, 3, 4) 
kwargs =  {'a': 1, 'c': 3, 'b': 2} 
--------------------------------------- 
args =  ('a', 1, None) 
kwargs =  {'a': 1, 'c': 3, 'b': '2'} 
---------------------------------------

可以看到,这两个是python中的可变参数。 * args 表示任何多个无名参数,它是一个tuple; * *kwargs 表示关键字参数,它是一个dict。并且同时使用 * args和 * kwargs时,必须args参数列要在**kwargs前,像foo(a=1, b=‘2’, c=3, a’, 1, None, )这样调用的话,会提示语法错误“SyntaxError: non-keyword arg after keyword arg”。

在使用 * args时要注意,在一个函数里面如果既有确定参数,又有不确定参数时(元组类型的不确定参数),调用函数时,给确定参数赋值,不能用"=",否则会报错。

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 寻找有志同道合的小伙伴,互帮互助,
群里还有不错的视频学习教程和PDF电子书!
'''
In [1]: def test(a,b,c=100,*args):
   ...:     print "a:",a
   ...:     print "b:",b
   ...:     print "c:",c
   ...:     for i in args:
   ...:         print "i:",i
   ...:         

In [2]: test(20,10,50,200,300,400)
a: 20
b: 10
c: 50
i: 200
i: 300
i: 400

In [3]: test(b=20,a=10,c=50,200,300,400)
  File "<ipython-input-3-b174f70470b5>", line 1
    test(b=20,a=10,c=50,200,300,400)
SyntaxError: non-keyword arg after keyword arg

可以不给不确定参数赋值:

In [4]: test(b=20,a=10,c=50)
a: 10
b: 20
c: 50

如果是字典类型的不确定参数,可以用"="赋值:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 寻找有志同道合的小伙伴,互帮互助,
群里还有不错的视频学习教程和PDF电子书!
'''
In [10]: def test(a,b,c=200,**kwargs):
   ....:     print "a:",a
   ....:     print "b:",b
   ....:     print "c:",c
   ....:     for value in kwargs:
   ....:         print "%s:%s"%(value,kwargs[value])
   ....:         

In [11]: test(b=20,a=10,c=100,mm=20,nn=10,xsk=1)
a: 10
b: 20
c: 100
mm:20
xsk:1
nn:10

也可以用下面的形式:

In [26]: def test(arg1,arg2,arg3):
   ....:     print "arg1:",arg1
   ....:     print "arg2:",arg2
   ....:     print "arg3:",arg3
   ....:     

In [27]: args = ["two",1]

In [28]: test(2,*args)
arg1: 2
arg2: two
arg3: 1


In [40]: def test(a1,a2,a3):
   ....:     print "a1:",a1
   ....:     print "a2:",a2
   ....:     print "a3:",a3
   ....:     

In [41]: kwargs = {"a3":"you","a2":"love"}

In [42]: test("i",**kwargs)
a1: i
a2: love
a3: you
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值