1. 程式人生 > >python函式——形參中的:*args和**kwargs

python函式——形參中的:*args和**kwargs

多個實參,放到一個元組裡面,以*開頭,可以傳多個引數;**是形參中按照關鍵字傳值把多餘的傳值以字典的方式呈現

*args:(表示的就是將實參中按照位置傳值,多出來的值都給args,且以元祖的方式呈現)

示例:

1

2

3

4

5

def foo(x,*args):

print(x)

print(args)

foo(1,2,3,4,5)#其中的2,3,4,5都給了args

執行結果是:

1

2

1

(2345)

當args與位置引數和預設引數混用的情況下:(注意三者的順序)

示例一、(三者順序是:位置引數、預設引數、*args)

1

2

3

4

5

6

def foo(x,y=1,*args):

print(x)

print(y)

print(args)

foo(1,2,3,4,5)#其中的x為1,y=1的值被2重置了,3,4,5都給了args

 執行結果是:

1

2

3

1

2

(345)

 示例二、(三者順序是:位置引數、*args、預設引數)

1

2

3

4

5

6

def foo(x,*args,y=1):

print(x)

print(args)

print(y)

foo(1,2,3,4,5)#其中的x為1,2,3,4,5都給了args,y按照預設引數依舊為1

 執行結果是:

1

2

3

1

(2345)

1

其中關於*,可以從2個角度來看(需要拆分來看):

1、從形參的角度來看:

示例:

1

2

3

def foo(*args):#其實這一操作相當於def foo(a,b,c,d,e):

print(args)

foo(1,2,3,4,5)#其中的1,2,3,4,5都按照位置傳值分別傳給了a,b,c,d,e

執行結果是:

1

(12345)

2、從實參的角度來看:

示例:

1

2

3

4

5

6

def foo(x,y,z):

print(x)

print(y)

print(z)

foo(*(1,2,3))#其中的*(1,2,3)拆開來看就是:foo(1,2,3),都按照位置傳值分別傳給了x,y,z

執行結果是:

1

2

3

1

2

3

————————————————————————————————————————————————————

**kwargs:(表示的就是形參中按照關鍵字傳值把多餘的傳值以字典的方式呈現)

示例:

1

2

3

4

def foo(x,**kwargs):

print(x)

print(kwargs)

foo(1,y=1,a=2,b=3,c=4)#將y=1,a=2,b=3,c=4以字典的方式給了kwargs

執行結果是:

1

2

1

{'y'1'a'2'b'3'c'4}

關於**kwargs與位置引數、*args、預設引數混著用的問題:(注意順序)

位置引數、*args、**kwargs三者的順序必須是位置引數、*args、**kwargs,不然就會報錯:

示例:

1

2

3

4

5

def foo(x,*args,**kwargs):

print(x)

print(args)

print(kwargs)

foo(1,2,3,4,y=1,a=2,b=3,c=4)#將1傳給了x,將2,3,4以元組方式傳給了args,y=1,a=2,b=3,c=4以字典的方式給了kwargs

執行結果是:

1

2

3

1

(234)

{'y'1'a'2'b'3'c'4}

錯誤示例:(由於順序錯誤)

1

2

3

4

5

def foo(x,**kwargs,*args):

print(x)

print(args)

print(kwargs)

foo(1,y=1,a=2,b=3,c=4,2,3,4)

執行結果就會報錯:

1

SyntaxError: invalid syntax

位置引數、預設引數、**kwargs三者的順序必須是位置引數、預設引數、**kwargs,不然就會報錯:

示例:

1

2

3

4

5

def foo(x,y=1,**kwargs):

print(x)

print(y)

print(kwargs)

foo(1,a=2,b=3,c=4)#將1按照位置傳值給x,y按照預設引數為1,a=2,b=3,c=4以字典的方式給了kwargs

執行結果是:

1

2

3

1

1

{'a'2'b'3'c'4}

其中關於**,可以從2個角度來看(需要拆分來看):

1、從形參的角度來看:

示例:

1

2

3

def foo(**kwargs):#其實就是相當於def foo(y,a,b,c)

print(kwargs)

foo(y=1,a=2,b=3,c=4)

執行結果是:

1

{'y'1'a'2'b'3'c'4}

2、從實參的角度來看:

示例一:

1

2

3

4

5

6

def foo(a,b,c,d):

print(a)

print(b)

print(c)

print(d)

foo(**{"a":2,"b":3,"c":4,"d":5})#**{"a":2,"b":3,"c":4,"d":5}是將字典裡的每個值按照關鍵字傳值的方式傳給a,b,c,d

執行結果是:

1

2

3

4

2

3

4

5

示例二:

1

2

3

4

5

6

def foo(a,b,c,d=1):

print(a)

print(b)

print(c)

print(d)

foo(**{"a":2,"b":3,"c":4})#**{"a":2,"b":3,"c":4}是將字典裡的每個值按照關鍵字傳值的方式傳給a,b,c;d依舊按照預設引數

執行結果是:

1

2

3

4

2

3

4

1