python 中的變長引數列表

2021-09-03 02:49:45 字數 3002 閱讀 6208

在python中實現變長引數可以通過關鍵字引數以及非關鍵字引數來實現,使用 ** 指定字典為關鍵字引數, * 指定元組為非關鍵字引數。

1.關鍵字引數:

定義含有非關鍵字引數的函式:def func_name([位置引數或缺省引數,] *non_keyword_args)

>>> def func1(arg1,arg2,*arg3):

print('arg1:',arg1)

print('aeg2:',arg2)

for arg in arg3:

print('非關鍵字引數:',arg)

>>> func1(1,2,3,'a',1,'b')

arg1: 1

aeg2: 2

非關鍵字引數: 3

非關鍵字引數: a

非關鍵字引數: 1

非關鍵字引數: b

對於位置引數(和預設引數)會按照順序一一匹配或者按照引數名給出引數值,匹配完位置引數和預設引數後,如果還有額外的引數而且函式宣告了非關鍵字引數,就將這些引數打包成元組,作為非關鍵字引數。

上圖中,arg1匹配1,arg2匹配2,剩下的引數打包成元組傳遞給arg3。

2.關鍵字引數

定義含有非關鍵字引數的函式:def func_name([位置引數或缺省引數,] **keyword_args)

>>> def func2(arg1,arg2,**arg3):

print('arg1:',arg1)

print('arg2:',arg2)

for k in arg3.keys():

print('關鍵字引數 [',k,' : ',arg3[k],']')

>>> func2(1,2,k1='v1',k2='v2',k3='v3')

arg1: 1

arg2: 2

關鍵字引數 [ k1 : v1 ]

關鍵字引數 [ k2 : v2 ]

關鍵字引數 [ k3 : v3 ]

當函式中定義了關鍵字引數,位置引數和預設引數匹配完後,對於剩下的關鍵字引數就會打包成字典,傳遞給關鍵字引數。arg11匹配1,arg2匹配2,剩下的引數打包成字典傳遞給arg3。

在以上的情況中,如果傳入的引數經過位置引數和預設引數匹配完成後,還有函式無法匹配的引數則會出錯,比如:

>>> f1(1,2,3,'a'=1)

syntaxerror: keyword can't be an expression

>>> func2(1,2,3,k1='v1',k2='v2',k3='v3')

traceback (most recent call last):

file "", line 1, in func2(1,2,3,k1='v1',k2='v2',k3='v3')

typeerror: func2() takes 2 positional arguments but 3 were given

3.關鍵字引數和非關鍵字引數

在宣告函式的引數列表的過程中,各種引數宣告的順序:

def func_name(位置引數, 預設引數, 非關鍵字引數, 關鍵字引數)
注意:順序不可改變!

定義函式func:

>>> def func(arg1, arg2, arg3='default', *arg4, **arg5):

print('arg1:',arg1)

print('arg2:',arg2)

print('aeg3:',arg3)

for arg in arg4:

print('non-keyword arg:',arg)

for k in arg5.keys():

print('keyword arg [',k,':',arg5[k],']')

在給函式傳入引數時,可以提前將非關鍵字引數和關鍵字引數進行打包,例如:

>>> non_keyword_args = (1,2,3,4)

>>> keyword_args =

>>> func(1,2,3,*non_keyword_args,**keyword_args)

arg1: 1

arg2: 2

aeg3: 3

non-keyword arg: 1

non-keyword arg: 2

non-keyword arg: 3

non-keyword arg: 4

keyword arg [ k1 : v1 ]

keyword arg [ k2 : v2 ]

但是,如果出現這樣的情況呢:func(1,2,3,4,5,k3='v3',*non_keyword_args,**keyword_args)

執行試一下:

>>> func(1,2,3,4,5,k3='v3',*non_keyword_args,**keyword_args)

arg1: 1

arg2: 2

aeg3: 3

non-keyword arg: 4

non-keyword arg: 5

non-keyword arg: 1

non-keyword arg: 2

non-keyword arg: 3

non-keyword arg: 4

keyword arg [ k1 : v1 ]

keyword arg [ k2 : v2 ]

keyword arg [ k3 : v3 ]

注意:真正傳入函式的關鍵字和非關鍵字引數是以我們實際傳入的引數為準的,那些另外傳入的非關鍵字和關鍵字引數會和我們傳入的字典和元組進行打包作為最終傳入的引數。

python 中的變長引數列表

在python中實現變長引數可以通過關鍵字引數以及非關鍵字引數來實現,使用 指定字典為關鍵字引數,指定元組為非關鍵字引數。定義含有非關鍵字引數的函式 def func name 位置引數或缺省引數,non keyword args def func1 arg1,arg2,arg3 print arg...

python變長引數列表 可變長引數

可變長引數 預設情況下,必須使用正確數量的引數呼叫函式,這意味著,如果您的函式需要2個引數,則必須使用2個引數 不多也不少 來呼叫函式。示例,該函式需要2個引數,並獲得2個引數 def my function fname,lname print fname lname my function emi...

變長引數列表函式

可變引數列表 標頭檔案提供了遍歷未知數目和型別的函式引數表的功能。該標頭檔案的實現因不同的機器而不同,但提供的介面是一致的。假定函式 f 帶有可變數目的實際引數,lastarg 是它的最後乙個命名的形式引數 引數列表必須至少包括乙個命名引數 那麼,在函式 f 內宣告乙個型別為 va list 的變數...