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/