zoukankan      html  css  js  c++  java
  • Python ------的星号(*、**)的作用

    转自: https://blog.csdn.net/liuxingen/article/details/50113923

    1. 函数的可变参数

    当函数的参数前面有一个星号*的时候表示这是一个可变的位置参数,两个星号**表示是可变的关键字参数。

    #!env python
    #coding=utf-8
    #
    def foo(*args, **kwarg):
        for item in args:
            print item
    
        for k,v in kwarg.items():
            print k,v
        print 30*'='
    if __name__ == '__main__':
        foo(1, 2, 3, a=4, b=5)
        foo(2, 3, a=4, b=5, c=1)

    输出如下:

    lxg@web-Dev ~/station $ python test_param.py 
    1
    2
    3
    a 4
    b 5
    ==============================
    2
    3
    a 4
    c 1
    b 5
    ===========================

    这样我们可以传入任意个数的参数。

    2. unpack参数

    星号*把序列/集合解包(unpack)成位置参数,两个星号**把字典解包成关键字参数。下面通过示例来进一步加深理解:

    #!env python
    #coding=utf-8
    
    def foo(*args, **kwarg):
        for item in args:
            print item
        for k,v in kwarg.items():
            print k,v
        print 30*'='
    
    if __name__ == '__main__':
        #foo(1, 2, 3, a=4, b=5)
        #foo(2, 3, a=4, b=5, c=1)
        v = (1, 2, 4)
        v2 = [11, 15, 23]
        d = {'a':1, 'b':12}
        foo(v, d)
        foo(*v, **d)
        foo(v2, d)
        foo(*v2, **d)

    输出如下:

    lxg@web-Dev ~/station $ python test_param.py
    (1, 2, 4)
    {'a': 1, 'b': 12}
    ==============================
    1
    2
    4
    a 1
    b 12
    ==============================
    [11, 15, 23]
    {'a': 1, 'b': 12}
    ==============================
    11
    15
    23
    a 1
    b 12
    ==============================

    上面的示例中如果v、v2、d没有加星号那么就当成了一个参数传递给了函数,如果加了星号那么就会解包后传递给函数。foo(*d, **d)等价于foo(1, 2, 4, a=1, b=12)

    3. 几个注意点

    可变位置参数*args是一个元组,是不可修改的。

    >>> def foo(*args):
    ...     args[0] = 5
    ... 
    >>> foo(1, 2, 3)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "<stdin>", line 2, in foo
    TypeError: 'tuple' object does not support item assignment
    >>> l = [1, 2, 3]
    >>> foo(*l)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "<stdin>", line 2, in foo
    TypeError: 'tuple' object does not support item assignment

    无论我们怎么传入参数,args都是一个tuple类型,不能进行修改。 
    对于字典类型的如果只使用一个型号*那么传入的只是字典的键。

    >>> def foo2(*args, **kwarg):
    ...     print args, kwarg
    ... 
    >>> d = {'a':1, 'b':2, 'c':3}
    >>> foo2(*d)
    ('a', 'c', 'b') {}
    >>> foo2(**d)
    () {'a': 1, 'c': 3, 'b': 2}
  • 相关阅读:
    知识点复习
    【程序人生】一个IT人的立功,立言,立德三不朽
    【朝花夕拾】Android多线程之(三)runOnUiThread篇——程序猿们的贴心小棉袄
    【朝花夕拾】Android多线程之(二)ThreadLocal篇
    【朝花夕拾】Android多线程之(一)View.post()篇
    Camera2笔记
    HangFire多集群切换及DashBoard登录验证
    Linq 动态多条件group by
    Api接口签名验证
    postgre ||连接字段
  • 原文地址:https://www.cnblogs.com/loved/p/8695147.html
Copyright © 2011-2022 走看看