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

本文轉載自https://www.cnblogs.com/xuyuanyuan123/p/6674645.html

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

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

示例:

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章