1. 程式人生 > >我的python學習筆記之函式引數

我的python學習筆記之函式引數

python中函式引數的使用非常靈活,正因為靈活也導致剛接觸python會覺得凌亂,搞不清楚。函式無非兩種場景,定義和呼叫。形參是定義函式的時候,實參是呼叫函式時傳給函式的引數。

為了方便自己記憶,現把python函式引數的使用總結如下:

寫文章不容易,轉載請註明出處。

定義函式:

#情景一:固定個數的形參
def show1(a, b):
    print a,b

'''
情景二:任意引數整合之元組,此時表示函式可以接收任意個引數
我們知道,如果定義函式時指定了3個位置引數,都沒有預設值,那麼,在呼叫函式的時候,我們必須傳遞3個值給函式,否則會報錯。
show2函式則可以讓函式接收任意個引數,包括0個;show3函式可以接收大於等於2個引數。
'''
def show2(*a):
    print a
#第一個值和第二個值會自動匹配給形參a和形參b,而多餘的引數才會整合成一個元組,即c;注意順序,下文中有說明。
def show3(a,b,*c):
    print a,b,c
    
#情景三:任意引數整合之字典,字典對應的是關鍵字引數,注意順序,下文中有說明。
def show4(**a):
    print a
#第一個值和第二個值會自動匹配給形參a和形參b,而多餘的引數才會整合成一個字典,即c;注意順序,下文中有說明。
def show5(a,b,**c):
    print a,b,c

#情景四:預設引數,呼叫函式時傳引數量可以少於3個,但只能是少第三個,注意順序,位置引數必須全部在前面,設定預設值的引數必須全部在後面;注意順序,下文中有說明。
def show6(a,b,c=0):
     print a,b,c

#情景五:混合使用,注意順序,下文中有說明。
def show7(*a,**b):
    print a,b,c
def show8(a, b = 0, *c,**d):
    print a,b,c

定義函式時,形參書寫順序:
預設值引數必須在所有不帶預設值的引數的後面
------>帶星號的引數必須在所有不帶星號的引數(包括預設值引數)的後面
------>帶兩個星號(**)的引數必須在帶一個星號(*)的引數的後面;

呼叫show1函式:

#show1函式專用
vars1 = ["Lily", "Lucy"]
vars2 = {"a": "Lily", "b": "Lucy"}
var1 = "Lily"
var2 = "Lucy"

#呼叫方法1:常量,位置引數傳參,需要注意傳參順序;
show1("Lily", "Lucy")

#呼叫方法2:變數,位置引數傳參,需要注意傳參順序;
show1(var1, var2)

#呼叫方法3:關鍵字引數,關鍵字引數是呼叫函式時的一種傳參方式,且關鍵字引數的變數名必須跟定義函式時寫的形參名稱一樣,比如,定義函式的時候是形參a/b,那麼這裡使用關鍵字就必須使用a/b,而不能使用x/y等其他名稱;而預設引數是定義函式時的概念;關鍵字引數不需要關心傳參順序。
show1(a = "Lily", b = "Lucy")
show1(b = "Lucy", a = "Lily")
show1(a = var1, b = var2)
show1(b = var2, a = var1)

#呼叫方法4:引數解包之列表傳參,對應位置引數,此處引數數量必須跟定義函式的時候指定的一樣,否則會報錯;
show1(*vars1)

#呼叫方法5:引數解包之字典傳參,對應關鍵字引數,實參名稱必須和形參名稱一致,比如形參是a/b,傳入的字典keys必須就是a/b,不能是x/y;同時,此處引數數量必須跟定義函式的時候指定的一樣,否則會報錯;
show1(**vars2)

上述呼叫執行結果,共8個輸出,也就說明是OK的;
show1函式呼叫執行結果

呼叫show2函式和show3函式:

xs = ["Jack", "Lily", "Lucy", "LiLei"]
ys = {"a": "Lily", "b": "Lucy", "c": "LiLei", "d": "Jack"}
w = "Jack"
x = "Lily"
y = "Lucy"
z = "LiLei"

show2(w,x,y,z)
輸出:('Jack', 'Lily', 'Lucy', 'LiLei')
show3(w,x,y,z)
輸出:Jack Lily ('Lucy', 'LiLei')

show2(*xs)
輸出:('Jack', 'Lily', 'Lucy', 'LiLei')
show3(*xs)
輸出:Jack Lily ('Lucy', 'LiLei')

show2(**ys)
輸出:
字典傳參其實利用的關鍵字引數原理,而show2函式定義的時候,使用的是*a,不存在位置引數a,所以這裡會報錯;
Traceback (most recent call last):
  File "./paras.py", line 42, in <module>
    show2(**ys)
TypeError: show2() got an unexpected keyword argument 'a'
show3(**ys)
輸出:a,b都正常傳參,函式show3沒有定義c、d形參;所以這裡報錯提示沒有關鍵字c。
Traceback (most recent call last):
  File "./paras.py", line 42, in <module>
    show3(**ys)
TypeError: show3() got an unexpected keyword argument 'c'

小結:
函式show4-show8不再貼圖,呼叫函式時的傳參方法都在【呼叫show1函式】部分,函式定義時的引數寫法都包含在上文中。定義函式和呼叫函式是兩個一定程度上相互獨立的事情,尤其是函式引數傳遞賦值尤其如此。