python函數——形參中的:位置參數,關鍵字參數,默認參數,*args 和 **kwargs的關係

位置參數:按照參數位置依次賦值

def foo(a,b,c):
    print("a:" + a)
    print("b:" + b)
    print("c:" + c)

foo("aaa","bbb","ccc")

運行結果:

a:aaa
b:bbb
c:ccc

關鍵字參數:用於函數調用,通過“鍵-值”形式加以指定。可以讓函數更加清晰、容易使用,同時也清除了參數的順序需求。

#關鍵字參數傳入時位置可以不一一對應,也可以與位置參數混合使用
#注意,關鍵字參數必須在位置參數之後,否則產生二義性,編譯不通過
def foo(a,b,c):
    print("a:" + a)
    print("b:" + b)
    print("c:" + c)

foo("aaa",c="is c",b="is b")

運行結果:

a:aaa
b:is b
c:is c

如下編譯不通過,會報錯:

def foo(a,b,c):
    print("a:"+a)
    print("b:"+b)
    print("c:"+c)
#錯誤示範,這樣調用編譯不通過
foo("is c",a="is a",b="is b")

提示報錯:foo()的參數a有多個值

TypeError: foo() got multiple values for argument 'a'

默認參數:用於定義函數,爲參數提供默認值,調用函數時可傳可不傳該默認參數的值(注意:所有位置參數必須出現在默認參數前,包括函數定義和調用)

def foo(a,b,c="hello C"):
    print("a:"+a)
    print("b:"+b)
    print("c:"+c)

foo("hello A","hello B")
'''運行結果爲:
a:hello A
b:hello B
c:hello C'''

foo("hello a",b="hello b",c="hello c")
'''運行結果爲:
a:hello a
b:hello b
c:hello c'''

foo("a","b","c")
'''運行結果爲:
a:a
b:b
c:c'''

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

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

def foo(x,*args):
    print(x)
    print(args)
foo(1,2,3,4,5)#其中的2,3,4,5都給了args

運行結果:

1
(2, 3, 4, 5)

當args與位置參數和默認參數混用的情況下:(注意三者的順序)

示例一、(三者順序是:位置參數、默認參數、*args)

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, 4, 5)

 示例二、(三者順序是:位置參數、*args、默認參數)

def foo(x,*args,y=999):
    print(x)
    print(args)
    print(y)

foo(1,2,3,4,5)#其中的x爲1,2,3,4,5都給了args,y按照默認參數依舊爲1

執行結果是:

1
(2, 3, 4, 5)
999

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

1、從形參的角度來看:

示例:

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, 2, 3, 4, 5)

2、從實參的角度來看:

示例:

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

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

示例:

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
{'y': 1, 'a': 2, 'b': 3, 'c': 4}

關於*kwargs與位置參數、args、默認參數混着用的問題:(注意順序)

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

示例:

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, 4)
{'y': 1, 'a': 2, 'b': 3, 'c': 4}

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

def foo(x,**kwargs,*args):
    print(x)
    print(args)
    print(kwargs)
foo(1,y=1,a=2,b=3,c=4,2,3,4)

執行結果就會報錯:

SyntaxError: invalid syntax

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

示例:

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
1
{'a': 2, 'b': 3, 'c': 4}

  

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

1、從形參的角度來看:

示例:

def foo(**kwargs):#其實就是相當於def foo(y,a,b,c)
    print(kwargs)
foo(y=1,a=2,b=3,c=4)

執行結果是:

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

2、從實參的角度來看:

示例一:

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

執行結果是:

2
3
4
5

示例二:

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依舊按照默認參數

執行結果是:

2
3
4
1

上文中關於*args和**kwargs的例子是引用下面這位兄弟的,原文鏈接在下面
https://www.cnblogs.com/xuyuanyuan123/p/6674645.html

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