日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python编程学习:让函数更加灵活的*args和**kwargs(设计不同数量参数的函数)的简介、使用方法、经典案例之详细攻略

發布時間:2025/3/21 python 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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,即打包成tuplekwargs包含key,即打包關鍵字參數
def a_function(*args, **kwargs):pass

?

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(不可變的)
def args01(*args):print(args, type(args)) args01('一個處女座的程序猿')def args02(x, y, *args):print(x, y, args) args02(1, 2, 3, 4, '我是','一個處女座的程序猿')('一個處女座的程序猿',) <class 'tuple'> 1 2 (3, 4, '我是', '一個處女座的程序猿')

?

?

(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三個參數的位置必須是一定的。
def VariableParasNum_Test(arg,*args,**kwargs):print('VariableParasNum_Test')print(arg,args,kwargs) VariableParasNum_Test(1,2,3,4,a=5, b=6, c=7)VariableParasNum_Test 1 (2, 3, 4) {'a': 5, 'b': 6, 'c': 7}

?

(1)、函數參數中不包含默認參數的情況

其中

  • x為1,y為2;
  • 3,4都給args,即args=(3,4);
  • a=5,b=6,
  • y=7以字典形式傳給kwargs
def VariableParasNum_NoDefault_Test(x, y, *args,**kwargs):print('VariableParasNum_NoDefault_Test')print(x, y, args, kwargs) VariableParasNum_NoDefault_Test(1,2,3,4,a=5,b=6,c=7) VariableParasNum_NoDefault_Test 1 2 (3, 4) {'a': 5, 'b': 6, 'c': 7}


?

(2)、函數參數中包含默認參數的情況

同時存在位置參數、默認參數、*args參數的情況:正確順序為以下兩種情況,切記位置參數均在最前邊

T1、(位置參數→默認參數→*args)

其中

  • x為1,
  • y=1的值被2替換,
  • 3,4,5都給args,即args=(3,4,5)
def VariableParas_IncludeDefault_Test(x,y=1,*args):print('VariableParas_IncludeDefault_Test')print(x,y,args) VariableParas_IncludeDefault_Test(1,2,3,4,5)VariableParas_IncludeDefault_Test 1 2 (3, 4, 5)

?

T2、(位置參數→*args→默認參數)

其中

  • x為1,
  • 2,3,4,5都給args,即args=(2,3,4,5)
  • y始終為1
def ArgsAndDefault_Test(x,*args,y=1):print('ArgsAndDefault_Test')print(x,args,y) ArgsAndDefault_Test(1,2,3,4,5) ArgsAndDefault_Test 1 (2, 3, 4, 5) 1

?

?

(3)、同時包含當位置參數、默認參數、*args*、*kwargs參數的情況:正確順序為位置參數→*args*→默認參數→*kwargs)

其中

  • x為1,y為2
  • 3,4都給args,即args=(3,4)
  • a,b分別被替換成5,6
  • y=7以字典形式傳給kwargs
def VariableParas_IncludeAll_Test(x, y, *args, a=8, b=9, **kwargs):print('VariableParas_IncludeAll_Test')print(x, y, args, a, b, kwargs) VariableParas_IncludeAll_Test(1,2,3,4,a=5,b=6,c=7)VariableParas_IncludeAll_Test 1 2 (3, 4) 5 6 {'c': 7}

?

?

?

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(设计不同数量参数的函数)的简介、使用方法、经典案例之详细攻略的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。