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,但这个是通常做法。

  • 相关阅读:
    long和Long的区别
    C语言的变量的内存分配
    Java蓝桥杯 算法提高 九宫格
    Java实现 蓝桥杯算法提高金明的预算方案
    Java实现 蓝桥杯 算法提高 新建Microsoft world文档
    Java实现 蓝桥杯 算法提高 快乐司机
    Java实现 蓝桥杯 算法提高 三角形
    Java实现 蓝桥杯 算法提高 三角形
    Java实现 蓝桥杯 算法提高 三角形
    Java实现 蓝桥杯 算法提高 三角形
  • 原文地址:https://www.cnblogs.com/clemente/p/10220168.html
Copyright © 2011-2022 走看看