我們知道函數是 Python 代碼編程的基礎。它可以接受零個或多個參數並返回值。函數參數傳遞非常靈活。*args 和 **kwargs 可以處理參數變得更容易、更簡潔。
*args 和 **kwargs 雖然功能強大,但能真正掌握的同學其實並不多。在這篇文章中,我將分享十個示例,讓你輕鬆掌握!
示例1如下函數是計算兩個數字的和
def addition(a, b):
return a + b
print(addition(3,4))此函數只需要輸入兩個數字。如果我們想要一個計算三個或四個數字的函數呢?我們甚至可能不希望對傳遞到函數的參數數設置約束。
在這種情況下,我們可以使用 *args 作為參數。
def addition(*args):
result = 0
for i in args:
result += i
return result傳遞給加法函數的參數存儲在元組中。我們可以在 args 變量上迭代。
示例2在第二個示例之前,先解釋「位置參數」和「關鍵詞參數」的區別。
調用函數時,必須給出「位置參數」的值。否則,我們將得到一個錯誤。如果我們不指定「關鍵字參數」的值,則它採用默認值。
def addition(a, b=2): #a is positional, b is keyword argument
return a + b
print(addition(1))
3
def addition(a, b): #a and b are positional arguments
return a + b
print(addition(1))
TypeError: addition() missing 1 required positional argument: 'b'我們現在可以做第二個例子了。
def arg_printer(a, b, *args):
print(f'a is {a}')
print(f'b is {b}')
print(f'args are {args}')
arg_printer(3, 4, 5, 8, 3)
a is 3
b is 4
args are (5, 8, 3)前兩個值被賦予 a 和 b。其餘值存儲在 args 元組中。
示例3如果我們在「位置參數」之後放置關鍵字參數。在調用函數時,我們看以下示例:
arg_printer(a=4, 2, 4, 5)
SyntaxError: positional argument follows keyword argument將值分配給通常為位置參數的 ,則它將成為關鍵字參數。由於後跟位置參數,因此我們得到一個「語法錯誤」。
示例4在下面的函數中,option 是關鍵字參數(它有一個默認值)
def addition(a, b, *args, option=True):
result = 0
if option:
for i in args:
result += i
return a + b + result
else:
return result由於option 默認值為 True,因此函數返回參數的總和,除非選項參數聲明為 False。
print(addition(1,4,5,6,7))
23
print(addition(1,4,5,6,7, option=False))
0
示例5**kwargs 收集未顯式定義的所有關鍵字參數。因此,它執行與 *args 相同的操作,但用於關鍵字參數。
默認情況下,**kwargs 是一個空字典。每個未定義的關鍵字參數都存儲為 **kwargs 字典中的鍵值對。
def arg_printer(a, b, option=True, **kwargs):
print(a, b)
print(option)
print(kwargs)
arg_printer(3, 4, param1=5, param2=6)
3 4
True
{'param1': 5, 'param2': 6}
示例6我們在函數中可以同時使用 *args 和 **kwargs,但 *args 必須放在 **kwargs 之前。
def arg_printer(a, b, *args, option=True, **kwargs):
print(a, b)
print(args)
print(option)
print(kwargs)
arg_printer(1, 4, 6, 5, param1=5, param2=6)
1 4
(6, 5)
True
{'param1': 5, 'param2': 6}
示例7我們可以使用 *args 和 **kwargs 打包和解包變量。
def arg_printer(*args):
print(args)如果我們將列表傳遞給上面的函數,它將作為單個元素存儲在 args 元組中。
lst = [1,4,5]
arg_printer(lst)
([1, 4, 5],)如果我們在 lst 之前放一個星號,列表中的值將解壓縮並單獨存儲在 args 元組中。
lst = [1,4,5]
arg_printer(*lst)
(1, 4, 5)
示例8我們可以通過多個可操作項與單個元素一起解包。所有值都將存儲在 args 元組中,這一招有時非常有用的。
lst = [1,4,5]
tpl = ('a','b',4)
arg_printer(*lst, *tpl, 5, 6)
(1, 4, 5, 'a', 'b', 4, 5, 6)
示例9我們也可以使用關鍵字參數進行打包和解包。
def arg_printer(**kwargs):
print(kwargs)但作為關鍵字參數傳遞的可執行參數必須是映射(如字典)
dct = {'param1':5, 'param2':8}
arg_printer(**dct)
{'param1': 5, 'param2': 8}
示例10如果我們還將其他關鍵字參數與字典一起傳遞,將它們組合併存儲在 kwargs 字典中。
dct = {'param1':5, 'param2':8}
arg_printer(param3=9, **dct)
{'param3': 9, 'param1': 5, 'param2': 8}
總結通過上述 10 個示例的講解,相信大家對*args 和 **kwargs 有了一定程度的理解。喜歡歡迎收藏、分享。
推薦一本對 Python 感興趣的書籍《Python進階》,是《Intermediate Python》的中文譯本,這本書具有如下幾個優點:簡單、易讀、易譯。這些都不是重點,重點是:它是一本開腦洞的書。無論你是Python初學者,還是Python高手,它顯現給你的永遠是Python裡最美好的事物。
領取方式:長按掃碼,發消息 [Python進階]
Python數據分析實例