python中函式的引數傳遞

程式設計師阿波發表於2019-04-27

函式的引數傳遞

在講函式引數傳遞前先補充兩個名詞

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
複製程式碼

注:

  1. 使用關鍵字引數允許函式呼叫時引數的順序與宣告時不一致,因為python直譯器能夠用引數名匹配引數值
  2. 關鍵字引數可以和位置引數混合使用,但位置引數必須要出現在關鍵字引數之前

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、混合傳遞方式

前面介紹的五種引數傳遞方式在定義和呼叫函式時可以混合使用,但在混合使用需要符合以下規則:

  1. 先位置引數傳遞
  2. 再關鍵字引數傳遞
  3. 再可變引數傳遞

注: 此方式在此不做程式碼演示

相關文章