1. 程式人生 > >Python3基礎之(十 二)函式預設引數

Python3基礎之(十 二)函式預設引數

我們在定義函式時有時候有些引數在大部分情況下是相同的,一小部分情況下是不同的,所以為了提高函式的適用性,為了方便函式呼叫,也為了提供一些備選引數,我們可以將這些引數設定為預設引數,那麼該引數在函式呼叫過程中可以不需要明確給出。

一、基本使用

def function(para_1,para_m=m,para_n=n):
    expressions

函式宣告只需要在需要預設引數的地方用 = 號給定即可, 但是要注意所有的預設引數都不能出現在非預設引數的前面。

二、例項

def function(a,b=2,c=3):
    print(a+b+c)
function(
2)

輸出結果為:7

function定義的時候指定b和c的預設引數,所以呼叫的時候就不需要再給出b和 c的值了,但是如果你不想用預設的值,可以在函式呼叫的時候重新指定,重新指定的值會覆蓋掉預設的值,舉例:

def function(a,b=2,c=3):
    print(a+b+c)
function(2,0,0)

輸出結果為:2

切記預設引數一定要在非預設引數的後面,例如:下面這種寫法是錯誤的:

def function(b=2,c=3,a):
    print(a+b+c)
function(2,0,0)

錯誤提示如下:

  File "D:/Users/hupo/PycharmProjects/pro1/test/test1.py"
, line 1 def function(b=2,c=3,a): ^ SyntaxError: non-default argument follows default argument

三、進階

3.1 自呼叫

如果想要在執行指令碼的時候執行一些程式碼,比如單元測試,可以在指令碼最後加上單元測試程式碼,但是該指令碼作為一個模組對外提供功能的時候單元測試程式碼也會執行,這些往往我們不想要的,我們可以把這些程式碼放入指令碼最後:

if __name__=='__main__':
    #code_here

如果執行該指令碼檔案的時候,該 if 判斷語句將會是 True,那麼內部的程式碼將會執行。 如果外部呼叫該指令碼檔案的時候,if 判斷語句則為 False,內部程式碼將不會執行。
3.2 可變引數


顧名思義,函式的可變引數是傳入的引數的個數可以變化的,1個,2個到任意個。當然可以將這些引數封裝成一個 list 或者 tuple 傳入,但不夠 pythonic。使用可變引數可以很好解決該問題,

注意可變引數在函式定義不能出現在特定引數和預設引數前面,因為可變引數會吞噬掉這些引數。

def function(a,b=2,c=3,*numbers):
    total=0
    for i in numbers:
        total+=i
    print(a+b+c+total)


if __name__=='__main__':
    function(2, 0, 0,2,3)

定義了一個函式function(),傳入一個引數為非預設引數 a ,兩個預設引數b,c, 後面的引數 *numbers使用了* 修飾,表明該引數是一個可變引數,這是一個可迭代的物件。該函式輸入各個引數的數值,輸出相加的總和。所以可以這樣呼叫函式 function(2,0,0,2,3),輸出的結果為:7, 也可以這樣呼叫function(2,0,0,2,3,4),輸出的結果為:11這裡需要注意可變引數的位置在預設引數之後
3.3 關鍵字引數

關鍵字引數可以傳入0個或者任意個含引數名的引數,這些引數名在函式定義中並沒有出現,這些引數在函式內部自動封裝成一個字典(dict).

def func(name,**other):
    print('name:',name)
    for k,v in other.items():
        print(k,v)

if __name__=='__main__':
    func('hupo',age='26',high='180',like='lizhongqi')

定義了一個函式,傳入一個引數 name, 和關鍵字引數other,使用了 ** 修飾。表明該引數是關鍵字引數,通常來講關鍵字引數是放在函式引數列表的最後。如果呼叫引數 func(‘hupo’,age=‘26’,high=‘180’,like=‘lizhongqi’)輸出:

name: hupo
age 26
high 180
like lizhongqi

通過可變引數和關鍵字引數,任何函式都可以用 universal_func(*args, **kw) 表達。