14.程式程式設計進階:函式的引數

大牧莫邪發表於2017-05-17

接上一講,這節我們專門介紹python函式的引數處理

本節主要內容 * 函式的形式引數和實際引數 * 函式的引數定義規則 * 函式引數的預設值 * 函式的可變引數 * 函式的關鍵字引數 * 函式的命名關鍵字引數

1.3. 函式的引數

1.3.1 函式的形式引數和實際引數

函式的引數主要會涉及到兩個概念:形式引數、實際引數 * 形式引數:其實就是定義函式時,函式括號中的變數,形式引數的意義是當前函式如果要被呼叫執行,就必須讓函式接收括號中定好的引數才能正常執行,就是形式上需要這些資料才能執行函式,所以稱為形式引數 * 實際引數:實際引數是我們在通過函式名稱呼叫函式時,在括號中傳遞的真實資料;實際傳遞給函式用於執行的資料,稱為實際引數 形式引數和實際引數的具體關係如下圖所示: 形式引數和實際引數的關係

1.3.2. 函式的引數定義規則

函式通過def進行定義,用於執行一個功能,一個函式,可以需要引數,也可以不需要引數。 類似我們現實生活,執行一個功能就是做一件事情,做這件事情需要的資源就是引數,去做一件事情,有些需要資源,有些是不需要資源的。

所以! 規則1:如果我們的程式中出現了一部分功能程式碼重複執行,就需要封裝一個函式來減少程式碼的重複量 規則2:根據程式碼執行是否需要其他額外的資料,需要額外的幾個資料就定義幾個引數,不需要額外的資料就不定義引數 規則3:實際引數可以傳遞任意物件(python中一切皆物件)

1.3.3. 函式引數預設值

某些時候,我們可以給函式的引數定義預設值,這樣函式在呼叫過程中,如果某些引數沒有傳遞,就直接使用預設值來執行函式程式碼了,函式預設引數確定比較簡單,直接在形式引數上賦值就可以 ```

# 重新定義函式,給引數設定預設值5
def getCircleArea(pi=3.1415, radius=5) :
    a = pi * (radius ** 2);
    return a;

# 呼叫函式計算圓面積,不傳遞引數,使用預設值
a1 = getCircleArea();
# 呼叫函式,傳遞引數進行計算
a2 = getCircleArea(3.14, 3);
# 呼叫函式,給第二個引數傳遞資料進行計算
a3 = getCircleArea(radius=8);

```

1.3.4. 函式的可變引數

在某些情況下, 函式的引數個數不是確定的,這樣在常規定義函式時就木有辦法進行形式引數的定義了。 python提供了一種可變引數,可以完美的解決這個問題 可變引數,是在形式引數前面加一個*符號作為標識 ```

# 定義一個函式,用於列印多個資料
def printMsg(*msgs) :
    for x in msgs:
        print(x);

printMsg("tom");
printMsg("tom", "jerry");
printMsg("tom", "jerry", "shuke");
# 以上三個函式呼叫,都是可以正常執行的

```

注意,在某些特殊情況下,函式的可變引數放在了固定引數的前面;此時函式的呼叫就需要通過變數名稱指定資料了(這個也成為命名關鍵字引數,後面的內容中有單獨介紹) ```

# 可變引數msgs放在固定引數name的前面了
def printMsg(*msgs, name) :
    print (name);
    print(msgs);
    for x in msgs:
        print("-->" + x);
# 普通呼叫,出現錯誤
# 函式中的引數都被可變引數接收了,name就木有可以接收的資料了
printMsg("tom", "jerry");
# 必須如下方式呼叫才可以;指定name引數傳遞資料
printMsg("tom", "jerry", name="shuke");

```

可變引數是將傳入函式的多個引數,自動封裝成了一個tuple字典,也就是一組資料來使用。 上面的可變引數*msgs在函式中列印的結果如下: ```

print (msgs);
執行結果:("tom", "jerry")

```

1.3.5. 特殊的用法:關鍵字引數

將傳遞給函式的引數,解析成dict字典的形式,也就是key:value鍵值對的形式,這就是關鍵字引數的意義,更加方便可變引數的操作 關鍵字引數,使用兩個**符號來宣告關鍵字引數 ```

def printMsg(**msgs) :
    print(msgs);

printMsg(name="jerry", age=18);
函式中列印結果:{name:"jerry", age:18}

```

注意,關鍵字引數,還可以指定只能傳遞什麼樣的名稱為引數名稱,就是命名關鍵字引數。命名關鍵字引數通過*符號作為分隔符號,符號後面的引數就是命名關鍵字引數 ```

# 定義具有命名關鍵字的引數
def printMsg(name, age, *, province, city):
    print(name, age, province, city);
# 呼叫時需要傳遞具體的引數
printMsg("tom", 18, province="HN", city="ZZ");

另外一種情況,就是在可變引數的後面,新增的引數都是命名關鍵字引數,這裡的命名關鍵字引數就不需要*符號分隔了

# 下面的函式,province和city兩個引數是放在可變引數*args後面的
# 就是制定的命名關鍵字引數,在前面可變引數部分有提到
def printMsg(name, age, *args, province, city):
    函式中的執行程式碼
# 此時函式的呼叫如下
printMsg("tom", 19, "tom is a cat", province="HZ", city="ZZ");

```

本節內容主要介紹python中的函式引數問題,下一節繼續介紹函式的返回值處理

相關文章