我的python學習筆記之函式引數
阿新 • • 發佈:2019-01-29
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的;
呼叫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函式】部分,函式定義時的引數寫法都包含在上文中。定義函式和呼叫函式是兩個一定程度上相互獨立的事情,尤其是函式引數傳遞賦值尤其如此。