python 魔法參數*argv 和 **kw

阿里雲大學人工智能學前小測驗-Python測驗

關於參數*argv 和 **kw的說法正確的是

A. 兩個參數必須爲函數定義中參數列表中的排名最後的參數

B. *argv 代表該參數位置可以放任意個數的數據

C. **kw 代表該參數位置可以放 k=v 格式的數據

D. *argv最終會轉換成列表數據類型在函數體內處理

 

參考資料:https://blog.csdn.net/weixin_43181110/article/details/83270129https://blog.csdn.net/xiongchun11/article/details/54405674,感謝博主們

其實*args 和 **kwargs這兩個變量並不是必須寫成這樣子,只是變量前面的這個*(星號)是必須要的,後面的變量名我們可以自己定義,這個*args 和 **kwargs只是一個通俗的命名約定而已。

args,是arguments的縮寫,單純意思是參數,kwargs是key word arguments的縮寫,表示關鍵字參數。

它倆都是可變參數,*args 是接收多個無名參數,是一個tuple;**kwargs表示關鍵字參數,它是一個dict。並且同時使用*args和**kwargs時,必須*args參數列要在**kwargs前,像foo(a=1, b='2', c=3, a', 1, None, )這樣調用的話,會提示語法錯誤“SyntaxError: non-keyword arg after keyword arg”
 

 總結:

相同點:兩個參數必須爲函數定義中參數列表中的排名最後的參數
不同點:
1.*argv代表該參數位置可以放置任意個數的數據,最終都會轉化成元祖數據類型在函數體內處理
2.**kw代表該參數位置可以放置k=v格式的數據,最終都會轉化成字典類型在函數體內處理

注意點:參數arg、*args、**kwargs三個參數的位置必須是一定的。必須是(arg,*args,**kwargs)這個順序,否則程序會報錯

 

首先看一下*args的用法:

*args 和 **kwargs 主要用於函數定義。 你可以將不定數量的參數傳遞給一個函數。
這裏的不定的意思是:預先並不知道, 函數使用者會傳遞多少個參數給你, 所以在這個場景下使用這兩個關鍵字。 *args 是用來發一個非鍵值對的可變數量的參數列表給一個函數.例如:

def test_var_args(f_arg, *argv):
print("first normal arg:", f_arg)
for arg in argv:
print("another arg through *argv:", arg)
test_var_args('yasoob', 'python', 'eggs', 'test')
這會產生如下輸出:
first normal arg: yasoob
another arg through *argv: python
another arg through *argv: eggs
another arg through *argv: test


下面看一下**kwargs的用法:

**kwargs允許你將一個不定長度的鍵值對,作爲參數傳遞給一個函數。如果需要在一個函數中處理帶名字的參數時,此時就應該使用**kwargs了。

例如:

def greet_me(**kwargs):
for key, value in kwargs.items():
print("{0} == {1}".format(key, value))
>>> greet_me(name="yasoob")
name == yasoob
這就是**kwagrs用處,可以讓我們很好的在函數中處理一個鍵值對參數。
接下來讓我們看一下怎樣使用*args 和 **kwargs來調用一個參數爲列表或者字典的函數。
假設,我們有這樣一個函數:

def test_args_kwargs(arg1, arg2, arg3):
print("arg1:", arg1)
print("arg2:", arg2)
print("arg3:", arg3)
我們現在使用*args或者**kwargs來給這個函數傳遞參數:
首先使用*args:

>>> args = ("two", 3, 5)
>>> test_args_kwargs(*args)
arg1: two
arg2: 3
arg3: 5
現在使用**kwargs:
>>> kwargs = {"arg3": 3, "arg2": "two", "arg1": 5}
>>> test_args_kwargs(**kwargs)
arg1: 5
arg2: two
arg3: 3


標準參數與*args、**kwargs在使用時的順序需要特別注意一下。
如果現在該一個函數中同時使用這三種參數,此時這三種參數的順序應該是:標準參數,*args,**kwargs

如 some_func(fargs, *args, **kwargs)
那麼關於什麼使用這些參數,這就需要看自己的需求啦,也不是每個函數都需要使用者三種參數的,比較常見的應該是在使用函數裝飾器的時候,此外它也可以用來做猴子補丁(monkey patch)。猴子補丁的意思是在程序運行時(runtime)修改某些代碼。 比如,你有一個類,裏面有個叫get_info的函數會調用一個API並返回響應的數據。如果我們想測試它,可以把API調用替換成一些測試數據。例如:

import someclass
def get_info(self, *args):
return "Test data"
someclass.get_info = get_info

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章