參數 (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 |
$ |
最後介紹如何定義不限個數的參數,有兩種,第一種是在參數前加上一個星號,如此例的 name , name 會是序對 (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'> |
$ |
相關教學影片
- Python 函數的關鍵字引數 ⇨ YouTube 頁面連結
- Python 函數的預設引數 ⇨ YouTube 頁面連結
- Python 函數的函數參數 ⇨ YouTube 頁面連結
- Python 函數的不限個數參數 ⇨ YouTube 頁面連結