天天看點

Python的args和kwargs了解

衆所周知,python的args是用來接收不定長的參數,而kwargs是用來接收不定長的關鍵字參數。

下面通過執行個體來看看如何真正的了解這兩個的用法。

def test2(a, b, *args, **kwargs):
    print("------test2---------")
    print(a)
    print(b)
    print(args)
    print(kwargs)

def test1(a, b, *args, **kwargs):
    print("-------test1---------")
    print(a)
    print(b)
    print(args)
    print(kwargs)
    print("The output of a, b, args, kwargs")
    test2(a, b, args, kwargs)
    print("The output of a, b, *args, kwargs")
    test2(a, b, *args, kwargs)
    print("The output of a, b, *args, **kwargs")
    test2(a, b, *args, **kwargs)


test1(11,22,33,44,55,66, name="zhangsan", age=18)
           

The output of the test code like following:

-------test1---------

11

22

(33, 44, 55, 66)

{‘name’: ‘zhangsan’, ‘age’: 18}

The output of a, b, args, kwargs
------test2---------
11
22
((33, 44, 55, 66), {'name': 'zhangsan', 'age': 18})
{}
           

從這個結果來看,(33, 44, 55, 66), {‘name’: ‘zhangsan’, ‘age’: 18}被作為一個整體傳給了test2函數的args對象;然後kwargs沒有實參。

The output of a, b, *args, kwargs
    ------test2---------
    11
    22
    (33, 44, 55, 66, {'name': 'zhangsan', 'age': 18})
    {}
           

從這個結果來看,(33, 44, 55, 66, {‘name’: ‘zhangsan’, ‘age’: 18})被作為一個整體傳給了test2函數的args對象;然後kwargs沒有實參。

The output of a, b, *args, **kwargs
    ------test2---------
    11
    22
    (33, 44, 55, 66)
    {'name': 'zhangsan', 'age': 18}
           

從這個結果來看,(33, 44, 55, 66)被作為一個整體傳給了test2函數的args對象; {‘name’: ‘zhangsan’, ‘age’: 18}傳給了kwargs參數,這個才是我們期待的結果。

總結起來,可以這麼了解,*args可以了解為對實參的一個拆包,**args也是對實參的拆包。不帶星花就不拆包,會被當做一個整體。