一文帶你精通Python中*args和**kwargs的應用技巧
大家好,如果能在Python中創(chuàng)建適應不同場景的函數(shù),而無需每次都重寫它們,會使得操作簡潔方便,這就是*args和**kwargs的魔力所在。就像為函數(shù)準備了一個神奇的袋子,可以裝下任意多的參數(shù)——使代碼更整潔、更靈活。
為了幫助大家更好地理解Python中的*args和**kwargs,接下來展示一下如果沒有這些概念,代碼將會是什么狀態(tài)。
這里展示一個簡單的函數(shù)simple_sum,用于將兩個數(shù)字相加:
def simple_sum(a, b): return a + b result = simple_sum(3, 7) print(result)
想象一下如果想創(chuàng)建一個將三個數(shù)字相加的函數(shù),最終可能會以如下方式重寫這個函數(shù):
def simple_sum_three(a, b, c): return a + b + c result_three = simple_sum_three(3, 7, 5) print(result_three)
如果想將更多的數(shù)字相加,不得不為每種情況創(chuàng)建新函數(shù),這既不優(yōu)雅也不靈活。為了解決這個問題,有一個稱為“參數(shù)打包”的概念,可以在函數(shù)定義語句中使用*符號,將一個參數(shù)轉換為超級參數(shù),它可以作為一個袋子,并在調用函數(shù)時容納/打包傳遞它的所有值,存儲在一個變量中。
同樣,符號*也可以用于解包數(shù)據(jù)結構,具體取決于它的使用方式,本文將在后面介紹如何做到這一點。
1.使用*args進行參數(shù)打包
在Python中,當在函數(shù)定義中看到一個星號(*)緊跟在一個參數(shù)前面時,這是參數(shù)打包的信號。這意味著可以向函數(shù)傳遞任意數(shù)量的參數(shù),它們將被整潔地打包成一個元組。就像為函數(shù)準備了一個神奇的袋子,使它能夠適應不同的情況,而無需不斷地重寫函數(shù)。
def magic_sum(*args): result = sum(args) return result # 三個數(shù)字相加 result1 = magic_sum(3, 7, 5) print("Result 1:", result1) # 預期輸出:15(3+7+5) # 五個數(shù)字相加 result2 = magic_sum(1, 2, 3, 4, 5) print("Result 2:", result2) # 預期輸出:15(1+2+3+4+5) # 相加更多數(shù)字 result3 = magic_sum(10, 20, 30, 40, 50, 60) print("Result 3:", result3) # 預期輸出:210(10+20+30+40+50+60)
在這個示例中,magic_sum函數(shù)使用*args進行參數(shù)打包??梢允褂貌煌瑪?shù)量的參數(shù)調用這個函數(shù),它會將這些參數(shù)整潔地打包成一個元組進行加法運算。在這種情況下,變量args就變成了一個元組。就像有了一個可以處理任意數(shù)量輸入的計算器,而無需更改其公式。
2.參數(shù)解包
另一方面,在調用函數(shù)時,可以使用星號(*)表示正在解包一個值序列(元組、列表、集合、字符串),并將其元素作為單獨的值傳遞。這種方法適用于將數(shù)據(jù)保存在集合(例如元組)中,但希望從集合中提取每個值,并將其作為單獨參數(shù)傳遞給函數(shù)的情況。
def display_values(a, b, c): print("Value of a:", a) print("Value of b:", b) print("Value of c:", c) # 解包一個元組并將其元素作為單獨的值傳遞 tuple_values = (7, 14, 21) display_values(*tuple_values) # 等同于 display_values(7, 14, 21)
可以使用此方法從多個集合類型數(shù)據(jù)中提取值:
def display_values(a, b, c): print("Value of a:", a) print("Value of b:", b) print("Value of c:", c) # 解包一個元組并將其元素作為單獨的值傳遞 tuple_values = (7, 14, 21) display_values(*tuple_values) # 等同于 display_values(7, 14, 21) # 解包一個列表 list_values = [30, 40, 50] display_values(*list_values) # 等同于 display_values(30, 40, 50) # 解包一個字符串(每個字符成為單獨的參數(shù)) string_values = "XYZ" display_values(*string_values) # 等同于 display_values('X', 'Y', 'Z') # 解包一個集合 set_values = {60, 70, 80} display_values(*set_values) # 順序可能會有變化,等同于 display_values(60, 70, 80) # 解包一個范圍 range_values = range(3, 6) display_values(*range_values) # 等同于 display_values(3, 4, 5)
還可以將函數(shù)定義部分的a、b、c更改為values以接收可變數(shù)量的參數(shù)。values將成為傳遞的所有參數(shù)的元組。這可以理解為同時進行打包和解包。
def display_values(*values): # 將數(shù)值打包到一個變量中。 print("Values:", values) # 解包一個元組并將其元素作為單獨的值傳遞 tuple_values = (7, 14, 21) display_values(*tuple_values)
3.使用**進行關鍵字參數(shù)打包
接下來,本文將使用雙星號(**),這是Python的一個運算符,它將字典的打包和解包引入其中。當一個函數(shù)參數(shù)以“**”為前綴時,它表示相應的參數(shù)應該是鍵值對,并整齊地打包成一個字典。這與元組參數(shù)的打包相同,但用于函數(shù)參數(shù)為關鍵字參數(shù)的情況。
def display_info(**kwargs): for key, value in kwargs.items(): print(f"{key}: {value}") # 在函數(shù)調用中直接傳遞關鍵字參數(shù) display_info(name='Alice', age=25, city='Wonderland')
4.關鍵字參數(shù)解包
解包字典,并將其內容作為單獨的關鍵字參數(shù)傳遞給函數(shù)。這種方法適用于將數(shù)據(jù)保存在字典中,但又想從字典中提取每個鍵值對,并將其作為單獨的關鍵字參數(shù)傳遞給函數(shù)的情況:
def display_person_info(name, age, city): print("Name:", name) print("Age:", age) print("City:", city) # 解包一個包含預期鍵值對的字典 person_info = {'name': 'Alice', 'age': 25, 'city': 'Wonderland'} display_person_info(**person_info)
5.結合使用*args和**kwargs
結合*args和**kwargs的力量,將它們分別視為長度可變的位置參數(shù)列表和關鍵字參數(shù)列表。
def display_information(*args, **kwargs): print("Positional Arguments (*args):") for arg in args: print(arg) print("\nKeyword Arguments (**kwargs):") for key, value in kwargs.items(): print(f"{key}: {value}") # 使用位置參數(shù)和關鍵字參數(shù)的混合調用函數(shù) display_information(1, 'apple', name='Alice', age=25, city='Wonderland')
在此示例中,display_information函數(shù)接收*args以處理任意數(shù)量的位置參數(shù),接收**kwargs以處理任意數(shù)量的關鍵字參數(shù),然后該函數(shù)分別打印每種類型的參數(shù)。
6.一次性進行多次解包
Python中的另一個有趣功能是能夠在單個函數(shù)調用中執(zhí)行多次解包。
def display_values(*args): for value in args: print(value) # 在單個函數(shù)調用中進行多次解包 list_values = [1, 2, 3] tuple_values = (4, 5, 6) set_values = {7, 8, 9} display_values(*list_values, *tuple_values, *set_values)
在此示例中,display_values函數(shù)使用多次解包以單行方式調用三種不同的可迭代類型(列表、元組和集合)。在函數(shù)調用期間,通過多次解包(*list_values,*tuple_values,*set_values)收集所有值,存儲在單個args參數(shù)中。
到此這篇關于一文帶你精通Python中*args和**kwargs的應用技巧的文章就介紹到這了,更多相關Python *args **kwargs內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
使用selenium+chromedriver+xpath爬取動態(tài)加載信息
這篇文章主要介紹了使用selenium+chromedriver+xpath爬取動態(tài)加載信息2022-02-02pyqt彈出新對話框,以及關閉對話框獲取數(shù)據(jù)的實例
今天小編就為大家分享一篇pyqt彈出新對話框,以及關閉對話框獲取數(shù)據(jù)的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-06-06Python Pandas中根據(jù)列的值選取多行數(shù)據(jù)
這篇文章主要介紹了Python Pandas中根據(jù)列的值選取多行數(shù)據(jù)的實例代碼,本文通過實例代碼給大家介紹的非常詳細 ,需要的朋友可以參考下2019-07-07python實現(xiàn)將JPG、BMP圖片轉化為bgr
這篇文章主要介紹了python實現(xiàn)將JPG、BMP圖片轉化為bgr方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03python數(shù)據(jù)分析之如何刪除value=0的行
這篇文章主要給大家介紹了關于python數(shù)據(jù)分析之如何刪除value=0的行的相關資料,文中通過實例代碼以及圖文介紹的非常詳細,對大家學習或者使用Python具有一定的參考學習價值,需要的朋友可以參考下2022-12-12