python3函數可變輸入參量

技術背景

通常我們在python中定義一個函數的時候,需要給出明確的函數輸入參量,比如對於一個數學函數\(z=f(x,y)\)就表示,\(z\)是關於\(x\)\(y\)的一個函數。但是如果對於未知參量的函數,比如函數形式可以是\(z=f(x,y)\),但也可以是\(z=f(x,y,m,n,i,j,k)\),在不確定入參的時候,就可以採用python中的*args**kwargs參數。

*args參數的使用方法

首先用一個例子來說明一下*args的基本用法,這個參量可以替代函數括弧中的固定變數,從數據結構上說是一個可變長度的tuple:

# test_args.py

def fargs(*args):
    s = 0
    for variable in args:
        s += float(variable)
    return s

if __name__ == '__main__':
    import sys
    args_string = ''
    for number in sys.argv[1:]: # 從命令行獲取任意長度的參數
        args_string += number
        args_string += ','
    s = eval('fargs({})'.format(args_string)) # 直接用字元串執行函數
    print ('The sum of {} is: {}'.format(args_string, s))

在這個案例中,我們不僅介紹了*args的使用方法,也利用了命令行參數獲取eval函數這兩個python中常見的使用技巧。其中關於獲取命令行參數的使用技巧,可以參考這一篇部落格。上述程式碼的執行效果如下所示:

[dechin@dechin-manjaro args]$ python3 test_args.py 1 2 3 3.14
The sum of 1,2,3,3.14, is: 9.14
[dechin@dechin-manjaro args]$ python3 test_args.py 1 2 3 3.14 0.86
The sum of 1,2,3,3.14,0.86, is: 10.0

這裡給了兩個不同長度的輸入,通過函數fargs完成了求和的工作,並且輸入的長度是可變的。

**kwargs的用法

**kwargs的用法是類似於上面介紹的*args的,區別在於**kwargs本質上是傳入了一個「字典」,或者稱之為一個鍵值對。需要注意的是,這裡每一個鍵值對的數據格式都是tuple類型的,而不是python中的字典類型,所以上面說到「字典」時加了引號。參考示例如下:

# test_kwargs.py

def fkwargs(**kwargs):
    s = 0
    print ('Key values input: ',kwargs)
    for key, variable in kwargs.items():
        s += float(variable)
    return s

if __name__ == '__main__':
    import sys
    args_string = ''
    for number in sys.argv[1:]:
        args_string += number
        args_string += ','
    s = eval('fkwargs({})'.format(args_string))
    print ('The sum of {} is: {}'.format(args_string, s))

這裡的場景我們設置為一個買菜購物計算總價格的函數,輸入的參數是每一個購買的物品及其價格,最後的輸出是購買總價格,測試結果如下所示:

[dechin@dechin-manjaro args]$ python3 test_kwargs.py egg=20 beaf=60 milk=10
Key values input:  {'egg': 20, 'beaf': 60, 'milk': 10}
The sum of egg=20,beaf=60,milk=10, is: 90.0
[dechin@dechin-manjaro args]$ python3 test_kwargs.py egg=20 water=1
Key values input:  {'egg': 20, 'water': 1}
The sum of egg=20,water=1, is: 21.0

總結概要

為了使得輸入參數的可擴展性更好,python中自帶了args和kwargs兩種方法,可以用於表示一個tuple類型的可變長度入參。其中args是一系列的一元變數的輸入,kwargs是一系列鍵值對的輸入,可以認為是一個二元變數的輸入。雖然這兩種方案也都可以用自行實現的tuple來替代,但是直接使用這兩種定義會節省很多自定義可變入參的繁瑣。

版權聲明

本文首發鏈接為://www.cnblogs.com/dechinphy/p/args.html
作者ID:DechinPhy
更多原著文章請參考://www.cnblogs.com/dechinphy/