zoukankan      html  css  js  c++  java
  • 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时要注意,在一个函数里面如果既有确定参数,又有不确定参数时(元组类型的不确定参数),调用函数时,给确定参数赋值,不能用"=",否则会报错。
    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
    
    如果是字典类型的不确定参数,可以用"="赋值:
    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
    
    
    
  • 相关阅读:
    JSON的数据格式
    KMP 算法
    爬虫原理
    快速求小于N的所有素数
    对程序员最具影响的书籍
    实现下拉更新UITableView EGORefreshTableHeaderView
    温习C/C++笔记——浅谈琐碎知识点(1)
    C++内存对齐
    SQL Server 安装程序无法获取 ASPNET 帐户的系统帐户信息
    Asp.Net生命周期事件
  • 原文地址:https://www.cnblogs.com/nyist-xsk/p/8257376.html
Copyright © 2011-2022 走看看