zoukankan      html  css  js  c++  java
  • Python *args 和 **kwargs用法

    *args的参数形式把剩下的没有关键字的参数收起来形成一个tuple,*kwargs把有关键字的收起来做成一个字典

    def this_fun(a,b,*args,**kwargs):
        print a
        print b
        print args
        print kwargs
    
    
    this_fun(0,1,2,3,index1=11,index2=22)
    0
    1
    (2, 3)
    {'index2': 22, 'index1': 11}

    *args

    如果你之前学过 C 或者 C++,看到星号的第一反应可能会认为这个与指针相关,然后就开始方了,其实放宽心,Python 中是没有指针这个概念的。

    在 Python 中我们使用星号收集位置参数,请看下面的例子:

    >>> def fun(x,*args):
    ...    print(x)
    ...    res = x
    ...    print(args)
    ...    for i in args:
    ...            res += i
    ...    return res
    ... 
    >>> print(fun(1,2,3,4,5,6))

    上述例子中,函数的参数有两个,但是我们在输出的时候赋给函数的参数个数不仅仅是两个,让我们来运行这个代码,得到如下的结果:

    1
    (2, 3, 4, 5, 6)
    21

    从上面我们可以看出,参数 x 得到的值是 1,参数 args 得到的是一个元组 (2,3,4,5,6) ,由此我们可以得出,如果输入的参数个数不确定,其它的参数全部通过 *args 以元组的方式由 arg 收集起来。

    为了更能明显的看出 *args,我们下面用一个简单的函数来表示

    >>> def print_args(*args):
    ...    print(args)
    ...

    接下来我传入不同的值,通过参数 *args 得到的结果我们来看一下:

    >>> print_args(1,2,3)
    (1, 2, 3)
    >>> print_args('abc','def','ghi')
    ('abc', 'def', 'ghi')
    >>> print_args('abc',['a','b','c'],1,2,3)
    ('abc', ['a', 'b', 'c'], 1, 2, 3)

    不管是什么,都可以一股脑的塞进元组里,即使只有一个值,也是用元组收集,所以还记得在元组里一个元素的时候的形式吗?元组中如果只有一个元素,该元素的后面要有一个逗号。

    那么如果不给 *args 传值呢?

    >>> def print_args(*args):
    ...    print(args)
    ... 
    >>> print_args()
    ()

    答案就是这时候 *args 收集到的是一个空的元组。

    最后提醒一点的是,当使用星号的时候,不一定要把元组参数命名为 args,但这个是 Python 中的一个常见做法。

    **kwargs

    使用两个星号是收集关键字参数,可以将参数收集到一个字典中,参数的名字是字典的 “键”,对应的参数的值是字典的 “值”。请看下面的例子:

    >>> def print_kwargs(**kwargs):
    ...    print(kwargs)
    ... 
    >>> print_kwargs(a = 'lee',b = 'sir',c = 'man')
    {'a': 'lee', 'b': 'sir', 'c': 'man'}

    由例子可以看出,在函数内部,kwargs 是一个字典。

    看到这的时候,可能聪明的你会想,参数不是具有不确定型吗?如何知道参数到底会用什么样的方式传值?其实这个很好办,把 *args 和 **kwargs 综合起来就好了啊,请看下面的操作:

    >>> def print_all(x,y,*args,**kwargs):
    ...    print(x)
    ...    print(y)
    ...    print(args)
    ...    print(kwargs)
    ... 
    >>> print_all('lee',1234)
    lee
    1234
    ()
    {}
    >>> print_all('lee',1,2,3,4,5)
    lee
    1
    (2, 3, 4, 5)
    {}
    >>> print_all('lee',1,2,3,4,5,like = 'python')
    lee
    1
    (2, 3, 4, 5)
    {'like': 'python'}

    如此这般,我们就可以应对各种各样奇葩无聊的参数请求了。当然在这还是要说的是,这里的关键字参数命名不一定要是 kwargs,但这个是通常做法。

  • 相关阅读:
    我的DBA之路:MYSQL数据类型
    我的DBA之路:MYSQL架构
    我的DBA之路:安装MySQL
    Java多线程系列之:显示锁
    Java多线程系列之:原子操作CAS
    Java多线程系列之:线程的并发工具类
    Java并发AQS原理分析(二)
    Java并发AQS原理分析(一)
    MySQL聚集索引和非聚集索引
    快速失败机制--fail-fast
  • 原文地址:https://www.cnblogs.com/clemente/p/10220168.html
Copyright © 2011-2022 走看看