Python 簡易手冊

單元 46 - 預設引數

定義函數 (function) 時在參數列 (parameter list) 可以直接用等號替參數 (parameter) 設定值,也就是讓參數有預設值,這叫做預設引數 (default arguemnt value) ,這樣在呼叫的時候可以不提供引數 (arguemnt) ,例如

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# 定義函數
def do_something(a=1, b=2, c=3, d=4):
    # 印出參數
    print(a, end=", ")
    print(b, end=", ")
    print(c, end=", ")
    print(d, end=", ")
    print()

# 呼叫函數
do_something()

# 檔名: def_demo7.py
# 說明: 《Python簡易手冊》的範例
# 網址: http://kaiching.org
# 作者: Kaiching Chang
# 時間: 2024 年 3 月

單元 44 - 函數與 return 陳述介紹如何定義函數。

由於四個參數都有預設值,因此呼叫的時候不需要提供引數,執行結果如下

> python def_demo7.py
1, 2, 3, 4,
>

但是有一點需要注意,如果預設引數有可變的 (mutable) 資料型態,例如串列,這時候只要函數名稱還在作用域當中,可變資料型態的預設引數就不會重新被設定,舉例如下

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
# 定義函數
def do_something(a=[], b=2, c=3, d=4):
    # 附加元素
    a.append(b)
    a.append(c)
    a.append(d)
    # 印出參數
    print(a)

# 呼叫函數
do_something()
do_something()

# 檔名: def_demo8.py
# 說明: 《Python簡易手冊》的範例
# 網址: http://kaiching.org
# 作者: Kaiching Chang
# 時間: 2024 年 3 月

這個例子的參數 a 的預設引數為空串列 (list) ,然後底下呼叫兩次 do_something() 函數,執行結果如下

> python def_demo8.py
[2, 3, 4]
[2, 3, 4, 2, 3, 4]
>

以上第二次呼叫 do_something() 的時候,參數 a 並沒有被重新指派為空串列,而是沿用第一次呼叫並建立的串列。如果希望可變資料型態的的預設引數要重新設定,那可以將預設引數設定為 None ,例如

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 定義函數
def do_something(a=None, b=2, c=3, d=4):
    # 判斷參數是否有值
    if a == None:
        a = []
        a.append(b)
        a.append(c)
        a.append(d)
    # 印出參數
    print(a)

# 呼叫函數
do_something()
do_something()
do_something([])
do_something(b=5,c=6,d=7)

# 檔名: def_demo9.py
# 說明: 《Python簡易手冊》的範例
# 網址: http://kaiching.org
# 作者: Kaiching Chang
# 時間: 2024 年 3 月

單元 20 - if 陳述介紹 if 陳述。

上例在函數工作先用中 if 判斷參數 a 是否為 None ,如果是 None 才把 a 設定為空串列,然後才做資料附加的部分,相對 a 不是 None 就只會執行最底下的印出 a ,底下執行部份呼叫 4 次,執行結果如下

> python def_demo8.py
[2, 3, 4]
[2, 3, 4]
[]
[5, 6, 7]
>

以上可以看到如果把預設引數設定為 None ,每一次執行都會重置,不會保留上一次的執行結果。

參考資料

上一頁 單元 45 - 位置引數與關鍵字引數
回 Python 簡易手冊 首頁
下一頁 單元 47 - 不限個數引數
回 Python 教材首頁
回程式語言教材首頁