Python编程学习:让函数更加灵活的*args和**kwargs(设计不同数量参数的函数)的简介、使用方法、经典案例之详细攻略
Python編程學習:讓函數更加靈活的*args和**kwargs(設計不同數量參數的函數)的簡介、使用方法、經典案例之詳細攻略
?
?
?
目錄
*args和**kwargs(設計不同數量的參數函數)的簡介
1、*用法:統計一個班內報名學籃球的同學,但是不知道有多少個人名
2、**用法:統計某個人的愛好,但是不知道這個人有多少種愛好
*args和**kwargs的函數定義使用方法——如何設計不同數量的參數的函數
T1、最基礎做法——創建一個list作為參數傳入(適合能枚舉所有值的情況)
T2、傳遞可變數量的位置參數的關鍵用法之*args和**kwargs
1、*args的簡介、使用方法(列表/元祖的形式,表示任何多個無名參數)
(1)、*args的簡介、使用方法
(2)、解決上邊的問題——如何設計不同數量的參數的函數
2、**kwargs的簡介、使用方法(字典的形式,表示一個一個有著對應關系的關鍵字參數)
(1)、**kwargs的簡介、使用方法
(2)、解決上邊的問題——如何設計不同數量的參數的函數
知識點拓展:函數中參數的順序——如何接受可變數量的位置參數和命名參數?
1、arg、*args、**kwargs的混合使用簡介——args和kwargs組合起來可以傳入任意個數的參數,這在參數未知的情況下是很有效的,同時加強了函數的可拓展性。
(1)、函數參數中不包含默認參數的情況
(2)、函數參數中包含默認參數的情況
(3)、同時包含當位置參數、默認參數、*args*、*kwargs參數的情況:正確順序為位置參數→*args*→默認參數→*kwargs)
2、深入理解解包(unpacking)星號操作符——*和**
(1)、利用解包操作符*應用于list輸出內容本身——print()會先將list解包
(2)、多個解包操作符*使用方法
(3)、利用解包操作符*將list分成三個不同的部分——第一個值、最后一個值和中間的所有值
(4)、利用解包操作符*將兩個list列表進行合并—使用*解包可迭代對象(列表和字符串)
(5)、利用解包操作符*對字符串進行解包操作:兩種方法
(6)、利用解包操作符**解包字典對象——**將兩個dict字典進行合并
*args和**kwargs的函數調用使用方法
?
?
?
*args和**kwargs(設計不同數量參數的函數)的簡介
? ? ? ? *args和**kwargs是 Python編程中可變參數的兩種形式,它們兩個代表的是變量,表示能夠接收可變長度的參數。?需要注意的是
- args和kwargs名稱并不重要,它們僅僅是約定俗成的一種命名規則,分別代表“參數”和“關鍵字參數”,所以,當然可以使用任何其他適當的參數名,比如*ar和**kw;
- *args 必須放在 **kwargs 的前面,因為位置參數在關鍵字參數的前面。
| ? | *args | **kwargs |
| 一句話解釋 | 將參數打包成tuple給函數體調用。 | 將參數打包關鍵字參數成dict給函數體調用。 |
| 功能 | 傳遞多個參數給函數,設計不同數量的參數的函數,這個參數數目未知,甚至長度可以為0。*args要在**kwags之前,不然會發生語法錯誤。 args和kwargs組合起來可以傳入任意個數的參數,這在參數未知的情況下是很有效的,同時加強了函數的可拓展性。 | |
| 顧名思義 | args 是 arguments 的縮寫,表示位置參數; | kwargs 是 keyword arguments 的縮寫,表示關鍵字參數。 |
| 用法 | 當我們不確定要往函數中傳入多少個參數,或者想往函數中以列表和元組的形式傳參數的情況下,要采用*args; | 當我們不確定要往函數中傳入多少個關鍵詞參數,或者想往函數中以字典的值作為關鍵詞參數傳參數的情況下,要采用**kwargs。 |
| 記憶 | args不包含key,即打包成tuple | kwargs包含key,即打包關鍵字參數 |
?
1、*用法:統計一個班內報名學籃球的同學,但是不知道有多少個人名
# 1、*用法:統計一個班內報名學籃球的同學,但是不知道有多少個人名 def CountLearnBasketballs(*basketNums):print("People who study basketball have:" + ", ".join(basketNums))# (1)、用在函數定義中 CountLearnBasketballs('馬云','馬化騰','李彥宏','劉強東','王興','丁磊') # (2)、用在函數調用中 basketNames = ('馬云','馬化騰','李彥宏','劉強東','王興','丁磊') CountLearnBasketballs(*basketNames)?
2、**用法:統計某個人的愛好,但是不知道這個人有多少種愛好
# 2、**用法:統計某個人的愛好,但是不知道這個人有多少種愛好 def CountHobbies(**hobbies):print("This person's hobbies include...")for category, fave in hobbies.items():print(f"{category}: {fave}")CountHobbies(sports='basketball', arts='drawing', learning='reading')?
?
*args和**kwargs的函數定義使用方法——如何設計不同數量的參數的函數
T1、最基礎做法——創建一個list作為參數傳入(適合能枚舉所有值的情況)
def SUMListsByLists(MoreParasLists):sum_lists = 0for a in MoreParasLists:sum_lists += areturn sum_lists MoreParasLists = [1, 2, 3, 4, 5, 6] print(SUMListsByLists(MoreParasLists))21?
?
?
T2、傳遞可變數量的位置參數的關鍵用法之*args和**kwargs
1、*args的簡介、使用方法(列表/元祖的形式,表示任何多個無名參數)
(1)、*args的簡介、使用方法
? ? ? ? *args 用來將參數打包成tuple給函數體調用,是非關鍵字參數,用于元組。此時,不是向函數傳遞一個list,而是接收位置參數,其原理是傳遞三個不同的位置參數。
- 上邊的SUMListsByArgs會獲取所有輸入的參數,并將它們打包成一個可迭代的簡單對象。
- 該對象可命名為args或者其它名稱args123,主要是前綴有“*”號,它是解包(unpacking)操作符。但是,該可迭代對象并非是一個list(可變的),而是一個元組tuple(不可變的)。
?
?
(2)、解決上邊的問題——如何設計不同數量的參數的函數
def SUMListsByArgs(*args):sum_lists = 0# Iterating over the Python args tuplefor a in args:sum_lists += areturn sum_lists print(SUMListsByArgs(1, 2, 3, 4, 5, 6))21?
?
2、**kwargs的簡介、使用方法(字典的形式,表示一個一個有著對應關系的關鍵字參數)
(1)、**kwargs的簡介、使用方法
? ? ?**kwargs將參數打包關鍵字參數以dict形式給函數體調用。其實,**kwargs工作原理和*args有點類似,但不是接收位置參數,而是接收關鍵字(keyword)參數(也叫被命名的參數)。同樣地,該對象可命名為kwargs或者其它名稱kwargs123,主要是前綴有“**”號,它是解包(unpacking)操作符。但是該可迭代對象是字典dict,所以獲取返回值要使用.values()。
def kwargs01(**kwargs):print( kwargs, type(kwargs)) kwargs01(a='一個處女座的程序猿')def kwargs02(**kwargs):print(kwargs) kwargs02(a='我是', b='一個處女座的程序猿', c='!'){'a': '一個處女座的程序猿'} <class 'dict'> {'a': '我是', 'b': '一個處女座的程序猿', 'c': '!'}?
?
(2)、解決上邊的問題——如何設計不同數量的參數的函數
def StrConnect(**kwargs):strs01='';strs02=''# Iterating over the Python kwargs dictionaryfor b in kwargs:strs01 += bfor a in kwargs.values():strs02 += aprint('keys集合:',strs01)print('values集合:',strs02)return strs02 print(StrConnect(a="大家好", b=",", c="我是", d="一個處女座的程序猿", e="!"))keys集合: abcde values集合: 大家好,我是一個處女座的程序猿! 大家好,我是一個處女座的程序猿!?
?
知識點拓展:函數中參數的順序——如何接受可變數量的位置參數和命名參數?
1、arg、*args、**kwargs的混合使用簡介——args和kwargs組合起來可以傳入任意個數的參數,這在參數未知的情況下是很有效的,同時加強了函數的可拓展性。
? ? ? args和kwargs組合起來可以傳入任意個數的參數,這在參數未知的情況下是很有效的,同時加強了函數的可拓展性。
- 順序很重要,非默認參數必須在默認參數之前處理,因此*args在**kwargs的前面;
- 參數的正確順序:位置參數→*args參數→**kwargs參數、非默認參數→默認參數;參數arg、*args、**kwargs三個參數的位置必須是一定的。
?
(1)、函數參數中不包含默認參數的情況
其中
- x為1,y為2;
- 3,4都給args,即args=(3,4);
- a=5,b=6,
- y=7以字典形式傳給kwargs
?
(2)、函數參數中包含默認參數的情況
同時存在位置參數、默認參數、*args參數的情況:正確順序為以下兩種情況,切記位置參數均在最前邊
T1、(位置參數→默認參數→*args)
其中
- x為1,
- y=1的值被2替換,
- 3,4,5都給args,即args=(3,4,5)
?
T2、(位置參數→*args→默認參數)
其中
- x為1,
- 2,3,4,5都給args,即args=(2,3,4,5)
- y始終為1
?
?
(3)、同時包含當位置參數、默認參數、*args*、*kwargs參數的情況:正確順序為位置參數→*args*→默認參數→*kwargs)
其中
- x為1,y為2
- 3,4都給args,即args=(3,4)
- a,b分別被替換成5,6
- y=7以字典形式傳給kwargs
?
?
?
2、深入理解解包(unpacking)星號操作符——*和**
解包(unpacking)操作符,是將python中可迭代對象的值解包的操作符。
- *:單個星號操作符,可以用在任意python提供的可迭代對象上。
- **:兩個星號操作符,只能用于字典。
?
(1)、利用解包操作符*應用于list輸出內容本身——print()會先將list解包
理解:print()已經將三個不同的參數作為輸入,而不是以一個list作為輸入。包操作符(*)來調用函數,而不是用在函數定義中。在這里,print()將list中的單個item作為一個個參數。如下所示,輸出不再是list本身,而是list的內容。
lists01 = [1, 2, 3, 4, 5, 6] print(lists01) print(*lists01)[1, 2, 3, 4, 5, 6] 1 2 3 4 5 6?
(2)、多個解包操作符*使用方法
用*操作符去解包一個list并傳遞給函數作為參數,就好像你在傳遞每一個單獨的參數。這表示你可以使用多個解包操作符,從多個lists中獲取值并作為參數傳遞一個函數。
def SUMListsByArgs(*args):res = 0for x in args:res += xprint(res)return reslist01 = [1] list02 = [2, 3] list03 = [4, 5, 6] SUMListsByArgs(*list01, *list02, *list03)21?
?
(3)、利用解包操作符*將list分成三個不同的部分——第一個值、最后一個值和中間的所有值
一個變量被分配給a,最后一個被分配給c,其它的值都被打包成一個list b。
lists = [1, 2, 3, 4, 5, 6] first, *middle, last = lists print(first, middle, last)1 [2, 3, 4, 5] 6?
?
(4)、利用解包操作符*將兩個list列表進行合并—使用*解包可迭代對象(列表和字符串)
list01 = [1, 2, 3] list02 = [4, 5, 6] list03 = [*list01, *list02] print(list03)[1, 2, 3, 4, 5, 6]?
?
(5)、利用解包操作符*對字符串進行解包操作:兩種方法
a ? = [*"一個處女座的程序猿"] ? ?# 直接解包 *b, = ? "一個處女座的程序猿" ? ? # *將字符串指定到一個新的list? print(a) print(b)['一', '個', '處', '女', '座', '的', '程', '序', '猿'] ['一', '個', '處', '女', '座', '的', '程', '序', '猿']?
?
(6)、利用解包操作符**解包字典對象——**將兩個dict字典進行合并
dict01 = {'AI':1, 'ML':2, 'DL':3} dict02 = {'CV':4, 'NLP':4, 'DS':4} dict03 = {**dict01, **dict02} print(dict03)?{'AI': 1, 'ML': 2, 'DL': 3, 'CV': 4, 'NLP': 4, 'DS': 4}
?
?
*args和**kwargs的函數調用使用方法
? ? ? ?*args和**kwargs不僅可以在函數定義中使用,還可以在函數調用中使用。在調用時使用就相當于pack(打包)和unpack(解包),類似于元組的打包和解包。
def unpackByargs(arg1, arg2, arg3):print(arg1, arg2, arg3) args = ("一個處女座的程序猿", 2021, 315) unpackByargs(*args)一個處女座的程序猿 2021 315?
?
?
?
總結
以上是生活随笔為你收集整理的Python编程学习:让函数更加灵活的*args和**kwargs(设计不同数量参数的函数)的简介、使用方法、经典案例之详细攻略的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python之 sklearn:skle
- 下一篇: Py之pandas:对dataframe