Python編程技術:函數的參數傳遞和*args和**kwargs

Python編程技術:函數的參數傳遞*args和**kwargs

參數傳遞

參數傳遞機制:python函數的參數傳遞具有值傳遞(int、float等值數據類型)和引用傳遞(以字典、列表等非值對象數據類型爲代表)兩種基本機制。

值傳遞,應用的參數不發生更改。(傳了個副本進去)

a = 5
def test(a):
    a+=1
    print("函數內:%d" % a)

test(a)
print(a)

結果:
函數內:6
5

引用傳遞,引用的參數發生更改(傳的是真實的地址)

a = [1,2,3]
def test(a):
    a.append(4)
    print("函數內:",a)

test(a)
print(a)

結果:
函數內: [1, 2, 3, 4]
[1, 2, 3, 4]

*args和**kwargs

python中還允許包裹方式的參數傳遞,這爲不確定參數個數和參數類型的函數調用提供了基礎:

知識點:
在函數調用時,*會以單個元素的形式解包一個元祖,使其成爲獨立的參數。
在函數調用時,**會以鍵/值對的形式解包一個字典,使其成爲獨立的關鍵字參數。

*args參數傳遞例子:

def f(a,*args):
    print(args)

f(1,2,3,4)
輸出爲:(2, 3, 4)

再看看**kwargs的參數傳遞的例子:

def f(**kargs):
    print(kargs)
    
f(a=1,b=2) # 實際傳入參數是兩個,但是給包裹在一起
輸出爲:{'a': 1, 'b': 2}
在python中,當 *args和**kwargs符號出現在函數定義的參數中時,表示任意數目參數。
*arg表示任意多個無名參數,類型爲tuple;**kwargs表示關鍵字參數,爲dict,
使用時需將*arg放在**kwargs之前,否則會有“SyntaxError: non-keyword arg after keyword arg”的語法錯誤。

再看看*args 和 **kwargs混合的例子

def h(a,*args,**kwargs):
    print(a,args,kwargs)

h(1,2,3,x=4,y=5)
# 丟進去不確定參數的包裹:1,2,3,x=4,y=5
# 解包:1                    -a
# 解包:(2,3)				 -*args
# 解包:{'x': 4, 'y': 5}	  -**kwargs
output: 1 (2, 3) {'x': 4, 'y': 5}

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