用最直白的語言解釋最複雜的概念,一系列教學讓你在短時間內掌握 Python
函數是一段可以重複使用的功能性代碼,通常接受輸入並返回輸出(雖然也有很多例外),Python 內建常見的函數有 print( )
、input( )
......,不過參數就像是工具一樣,需要呼叫它才會開始執行,沒有呼叫的話函數就形同虛設
在 Python 中,定義一個函數的基本語法如下:
def 函數名稱(參數):
函數內容……
參數可有可無,例如:
上面的例子就是一個沒有參數的函數,自定義函數 greet()
的功能就是將"你好,歡迎學習Python!"列印出來,而第4行就是透過函數呼叫,來執行這個函數。
這邊要注意,儘管沒有參數,在呼叫函數的時候也還是要加上小括號喔!
參數可以理解為用來接收輸入值的變數,呼叫函數時,可以輸入數值代入到函數之中,也可以在定義函數(函數宣告)的時候,設定預設值,這樣如果函數呼叫的時候沒有輸入參數值,就會以預設值代入函數中。
下面程式碼中的 print()
使用了 f-string,這是 Python 3.6 之後的新功能,文章最後會補充說明。
上面的範例可以看到,第5行在呼叫函數的時候,有輸入參數值"Alice",這樣"Alice"就會被帶入到函數中成為參數。
第7行我們重新定義函數 greet,並將 name 加上一個預設值"學生",如此一來,像第11行的函數呼叫沒有輸入參數值,就會輸出預設值"學生"。
如果需要函數接收不定數量的參數,可以使用 *
或 **
:
return
會將函數執行完的結果回傳到呼叫函數的位置,返回值可以用變數接收。直接來看到下面範例:
我先簡單拆解一下第一個範例:
add(3, 5)
→ 將 3 跟 5 代入函數的 a 跟 b。return a + b
→ 將 3+5 回傳到函數呼叫的地方,也就是 add(3, 5)
。第二個範例也跟上面差不多,但因為有 2 個回傳值,所以需要 2 個變數接收。
可以想像成遊戲中的主線劇情跟副本,副本中的角色不會影響主線的劇情走向,就算主線角色有出現在副本,當角色離開的時候也不會改變他的狀態,但如果人物直接消失在主線穿越到副本的話,當他穿越回來的時候可能就會改變,而這個穿越的媒介就是 global
。來看一下範例:
範例中,第1行跟第4行的變數 x 是不同的個體,所以一個等於10一個等於20,而不會互相衝突。當到了第11行,global x
將全域變數 x 整個代入到函數中,所以在函數中修改 x,其實是修改了全域的 x。
遞迴函數會在執行過程中不斷自己呼叫自己,通常需要一個明確的終止條件。
print(factorial(5))
→ 將 5 代入到函數的 n。return n*factorial(n-1)
→ 再次函數呼叫,以取得factorial(4)
的值。return n*factorial(n-1)
→ 再次函數呼叫,以取得factorial(3)
的值。if n==0 or n==1:
成立,return 1
。return 2*factorial(1)
的位置,所以回傳 2。return 3*factorial(2)
的位置,所以回傳 6。print(factorial(5))
輸出 120。遞迴的概念用文字比較難描述,可以看看下面的圖片,應該會比較容易理解。
f-string 是一種格式化字串的方式,可以在字串中嵌入變數,讓程式碼更簡潔易讀。
需要注意的是,雙引號前面要加上小寫 f,且變數的位置要用大括號 { } 包起來。
這個 Python 教學系列的程式檔都放在以下雲端資料夾,如果需要可以自行下載來試試看,請使用 Jupyter Notebook 開啟程式檔,資料夾中附有 Jupyter開檔教學,跟著我一步一腳印學習程式語言吧!