函式的引數傳遞
在講函式引數傳遞前先補充兩個名詞
1、形參: 即形式引數,它是在定義函式名和函式體時使用的引數,目的是接收呼叫該函式傳遞引數。 2、實參: 即實際引數,它是在呼叫時傳遞給函式的引數,傳遞給被呼叫函式的值。實參可以是常量、變數、表示式、函式等,但無論是哪種型別,在進行函式呼叫時必須具有確定的值,這些值會傳遞給形參。
下面用一段程式碼具體說明形參和實參
def sum(a,b):
retutn a+b
sum(10,20)
複製程式碼
在sum函式中a和b就是形參。第四行10和20就是實參
函式傳遞方式如下
1、位置引數傳遞
當呼叫函式時傳入的引數位置是和定義函式的引數位置相對應,當使用位置引數傳遞時,呼叫韓式傳入的引數數量要和定義函式引數的數量相同,否則程式會出錯。這也是函式預設的傳遞方式 觀察如下程式碼 fun_01:
def fun_01(a,b,c):
return a,b,c
print(fun_01(1,2,3))
複製程式碼
執行結果:
(1,2,3)
複製程式碼
fun_02:
def fun_02(a,b,c):
return c,b,a
print(fun_01(1,2,3))
複製程式碼
執行結果:
(3,2,1)
複製程式碼
上面兩個函式在定義時引數名是一樣的,並且在呼叫時傳入的引數也是一樣的,但返回的結果卻不同。這是由於當函式呼叫時,傳入的引數位置和定義的函式引數位置相對應,當呼叫函式傳入引數那一刻,函式的引數值就已經確定了,至於輸出結果的順序是由於return返回值的順序決定的。
2、關鍵字引數傳遞
假設某個函式的引數非常複雜,為了不讓程式出錯,我們可以把引數的名稱和值繫結在一起,使用引數名提供的引數叫作關鍵字引數 觀察如下程式碼 fun_01:
def connect(url,port):
return 'url is %s,and port is %s'%(url,port)
print(connect(url='www.baidu.com',port='80'))
複製程式碼
執行結果:
url is www.baidu.com,and port is 80
複製程式碼
注:
- 使用關鍵字引數允許函式呼叫時引數的順序與宣告時不一致,因為python直譯器能夠用引數名匹配引數值
- 關鍵字引數可以和位置引數混合使用,但位置引數必須要出現在關鍵字引數之前
3、引數預設值
在定義函式時,可以給引數賦予預設值,如果該引數最終沒有被傳遞值,將使用該預設值 觀察如下程式碼
def sum(a,b,c=20):
retutn a+b+c
sum(10,20)
複製程式碼
執行結果:
50
複製程式碼
注: 引數c使用了預設值
4、可變引數
在python中函式可以定義可變引數,即傳入函式的引數是可變的 語法格式如下:
def functionname([formal_args,]*args,**kwargs):
function_sutite
return [expression]
複製程式碼
說明: 在上述格式中,以星號(*)開始的變數args會存放所有的未命名的變數引數,args為元組;以**開始的變數kwargs會存放命名引數,即形如key=value的引數,kwargs為字典。 觀察如下程式碼
def test(*args,**kwargs):
print(args)
print(kwargs)
test(1,2,3,a=4,b=5)
複製程式碼
執行結果:
(1,2,3)
{'a':4,'b':5}
複製程式碼
注: 如果*和**引數混合使用,那麼傳入的順序必須和宣告的順序一致,如果呼叫函式時沒有指定引數,那麼它就是一個空的元組或者空的字典 對*和**總結:
-
使用*可以將未命名的引數打包成元組型別
-
使用**可以將命名的引數打包成字典型別
5、解包裹
所謂解包裹就是在呼叫函式時使用*和**。但是解包裹課可變引數傳遞並不是相反的操作,他們是兩個獨立的過程
觀察如下程式碼
*解元組型別
def test(a,b,c):
print(a,b,c)
args=(1,2,3)
test(*args)
複製程式碼
執行結果:
1 2 3
複製程式碼
**解字典型別
def test(a,b,c):
print(a,b,c)
kwargs=('a':1,'b':2,'c':3)
test(**kwargs)
複製程式碼
執行結果:
1 2 3
複製程式碼
6、混合傳遞方式
前面介紹的五種引數傳遞方式在定義和呼叫函式時可以混合使用,但在混合使用需要符合以下規則:
- 先位置引數傳遞
- 再關鍵字引數傳遞
- 再可變引數傳遞
注: 此方式在此不做程式碼演示