Python 自學第六天:定義函式和參數相關設定
函式存在的目的在於減少撰寫重覆的程式碼,當需要多次使用它的功能時,重複呼叫即可。
函式定義
定義一個函式的語法如下:
1 | def 函式名稱(參數1, 參數2, ...): |
參數是即將傳入函式的資料,回傳值則是函式產生的結果。基本狀態為沒有參數、有參數、沒有回傳值 (None) 和有回傳值。可以互相搭配。
沒有參數、沒有回傳值
1 | def say_hi(): |
有參數、沒有回傳值
1 | def say_hi_to_code_lang(code): |
如下程式碼雖然有 return
,但是沒有給予明確的回傳值,會和上方的程式碼有一樣的作用。
1 | def say_hi_to_code_lang(code): |
有回傳值
1 | def add(num1, num2): |
呼叫函式
函式定義完不會有任何事發生,就像一台計算機沒有人使用是不會產生計算結果的。
使用函式的方式就是呼叫它,也就是使用函式名稱加上一對小括弧,如: 函式名稱()
,再傳入零個、一個或數個資料 (參數)。
1 | # 呼叫函式 |
因為 say_hi()
和 say_hi_to_code_lang(code)
兩個函式中,有輸出 print()
指令,因此呼叫函式會輸出 Hello Python~
和 Hello Java!
。
如果函式有定義回傳值,我們就可以得到函式產生的結果,如下:
1 | # 定義函式 |
如果函式沒有 return
或 return
後方沒有明確的回傳值,則回傳值默認為 None
,如下:
1 | def say_hi(): |
參數
預設參數值
如果不想如上面那麼麻煩,寫兩種 say_hi
的函式,還能這樣定義:
1 | def say_hi_to_code_lang(code="Python"): |
給 code
這個函式中的變數一個預設值 "Python"
,如果今天呼叫時沒有傳入參數,函式就會直接使用預設值;如果呼叫時有傳入參數,函式就會使用傳入的資料。
沒有預設值和有預設值的參數可以一起使用,但是有預設值的參數要記得擺在沒有預設值參數的後方。
1 | # 定義函式 |
定義函式時,如果有預設值的參數 (default argument) 沒有全部放在無預設值的參數 (non-default argument) 後方,則會報錯:
1 | def borrow_book(title, num=1, author, borrower="guest"): |
關鍵字參數
呼叫函式時,傳入參數可以將關鍵字 (參數名稱) 指定值,即可忽略參數順序,如:
1 | # 定義函式 |
如果沒有指定名稱,呼叫函式時,參數則依照順序對應,"JK Rowling"
對應到 title
,"Harry Potter"
對應到 author
,"admin"
對應到 num
:
1 | borrow_book("JK Rowling", "Harry Potter", "admin") |
任意個數的參數
如果想要讓使用者可以傳入任意個數的參數,定義函式的語法如下:
1 | def 函式名稱(*任意個數參數名稱): |
雖然定義的時候,任意個數參數名稱
只有一個,但是因為前面有加 *
,因此在函式中,任意個數參數名稱
會將所有傳入的資料放在一起,轉變成 Tuple 資料型態。
呼叫函式時,記得傳入多個資料。
1 | # 定義函式 |
呼叫函式時,不能傳入 Tuple 資料,會報錯:
1 | def mean(*nums): |
為什麼呢?因為傳入 data
時,不會像我們以為的 nums = data
而是 nums = (data,)
。因此,int
也就是整數型態的 sum
不能和一整個 tuple
相加。
看看下面程式的輸出結果會更了解。
1 | # 定義函式 |
參考資料:
彭彭的課程:Python 函式基礎 - 定義並呼叫函式
彭彭的課程:Python 函式參數詳解 - 參數預設值、名稱對應、任意長度參數