Python 速查手冊

5.1 參數

參數 (parameter) 是函數 (function) 或方法 (method) 名稱之後小括弧提供的識別字 (identifier) 表列,這些識別字由呼叫方提供,進入函數內被當成區域變數 (local variable) 做計算。

參數 <==> 引數

基本上參數跟引數 (argument) 是相同的概念,差別是函數定義用參數一詞,呼叫函數時,由於是用實際數值呼叫函數,因此改用引數來稱呼,好作為特別區分,倒是概念是一樣的,多數老師並不會特別區分兩者差別,因此我們統稱為參數。

由於傳遞到函數內的參數都是物件 (object) ,因此都是傳遞參考 (pass by reference) ,所謂參考的意思是指對複合資料型態的物件而言,只要該物件是可變的,在函數內對該物件進行內容修改,就會連帶影響呼叫方原本的物件,此例變數原本為空串列 (empty list) ,函數 f1 利用 append() 方法將參數 a 附加一個新元素,因此呼叫 f1(d, 2) ,串列 d 就會新增一個元素整數 2

def f1(a, n):
    a.append(n)

d = []
f1(d, 2)
print(d)

#《程式語言教學誌》的範例程式
# http://kaiching.org/
# 檔名:parameter01.py
# 功能:示範參數定義
# 作者:張凱慶

於命令列執行以上程式,結果如下

$ python3 parameter01.py
[2]
$

可是相對如果參數 a 不是用串列來呼叫的話,就會發生屬性 (attribute) 錯誤,也就是 AttributeError

def f1(a, n):
    a.append(n)

d = ()
f1(d, 2)
print(d)

#《程式語言教學誌》的範例程式
# http://kaiching.org/
# 檔名:parameter02.py
# 功能:示範參數定義
# 作者:張凱慶

於命令列執行以上程式,結果如下

$ python3 parameter02.py
Traceback (most recent call last):
  File "parameter02.py", line 5, in <module>
    f1(d, 2)
  File "parameter02.py", line 2, in f1
    a.append(n)
AttributeError: 'tuple' object has no attribute 'append'
$

如果要解決參數不是預期資料型態 (data type) 的問題,可以用關鍵字 (keyword) assert 先檢查參數是否為預期的資料型態

def f2(a, n):
    try:
        assert type(a) == list
        a.append(n)
    except:
        print("第一個參數必須是串列")

d = ()
f2(d, 2)
print(d)

#《程式語言教學誌》的範例程式
# http://kaiching.org/
# 檔名:parameter03.py
# 功能:示範參數定義
# 作者:張凱慶

於命令列執行以上程式,結果如下

$ python3 parameter03.py
第一個參數必須是串列
()
$

呼叫函數或方法時,一般而言需要依據參數列的參數順序來呼叫,如果不想按照順序,此時用參數名稱加上等號來呼叫即可,這叫做關鍵字引數 (keyword argument)

def f3(a, b):
    print("a:", a)
    print("b:", b)

f3(1, 2)
f3(b=4, a=3)

#《程式語言教學誌》的範例程式
# http://kaiching.org/
# 檔名:parameter04.py
# 功能:示範參數定義
# 作者:張凱慶

於命令列執行以上程式,結果如下

$ python3 parameter04.py
a: 1
b: 2
a: 3
b: 4
$

參數也可以有預設值,只要定義的時候在參數列用等號設定預設值即可,這叫做預設引數 (default argument)

def f4(a=2, b=4):
    print("a:", a)
    print("b:", b)

f4()
f4(5, 7)

#《程式語言教學誌》的範例程式
# http://kaiching.org/
# 檔名:parameter05.py
# 功能:示範參數定義
# 作者:張凱慶

於命令列執行以上程式,結果如下

$ python3 parameter05.py
a: 2
b: 4
a: 5
b: 7
$

函數也能被當成參數,例如這裡 f5() 的參數 func 就是函數

def f4(a=2, b=4):
    print("a:", a)
    print("b:", b)

def f5(func):
    func

f5(f4())
f5(f4(8, 9))

#《程式語言教學誌》的範例程式
# http://kaiching.org/
# 檔名:parameter06.py
# 功能:示範參數定義
# 作者:張凱慶

於命令列執行以上程式,結果如下

$ python3 parameter06.py
a: 2
b: 4
a: 8
b: 9
$

最後介紹如何定義不限個數的參數,有兩種,第一種是在參數前加上一個星號,如此例的 namename 會是序對 (tuple) 型態,第二種則是在參數前加上連續兩個星號,如此例的 age ,這在呼叫時需要用等號設定數值, age 會是字典 (dictionary) 型態

def f6(*name, **age):
    print(type(name))
    print(type(age))

f6("John", "Mary", "9527", one=13, two=25,three=33)

#《程式語言教學誌》的範例程式
# http://kaiching.org/
# 檔名:parameter07.py
# 功能:示範參數定義
# 作者:張凱慶

於命令列執行以上程式,結果如下

$ python3 parameter07.py
<class 'tuple'>
<class 'dict'>
$

相關教學影片

上一頁:單元 5 - 函數
Python 速查手冊 - 目錄
下一頁: 5.2 回傳值
回 Python 教材首頁
回程式語言教材首頁