簡介
有些程式語言將函式稱為「 方法 」、「 程序 」或「 副程式 」。
函式的作用?
將一段『 具有某種功能 』或『 重複使用的敘述 』寫成獨立的程式單元,然後給予名稱,供後續呼叫使用,以『 簡化程式、提高可讀性 』。
為何需要學函式?
將程式碼包裝在一個區塊中,方便隨時呼叫使用!
函式的優缺點
- 優點
- 可重複使用,程式會變得比較精簡。
- 可讀性提高,容易偵錯、修改與維護。
- 缺點
- 多了一道呼叫的手續,使程式的執行速度減慢。
Python 常見函式分為四種
- 內建函式
- 自訂函式
- 匿名函式 lambda
- 遞迴函式 (Recursive function)
全域變數 與 區域變數
💡 指的是 變數的有效生存範圍。
全域變數 (Global Variable)
定義於 函式區塊外 的變數,可作用於整份 Python Script 的範圍。
#全域變數
i = 10
def f():
print(i)
f() #10
print(i) #10
區域變數 (Local Variable)
定義於 函式區塊內 的變數,僅能作用於函式區塊內。
def a1():
#區域變數,無法傳到外面
x = 1
print(x)
print(x) #NameError: name 'x' is not defined
內建函式
- Python 針對常見的用途所提供,但不一定能夠滿足所有需求。
- e.g.
print()
、input()
、eval()
、type()
、int()
、join()
…
自訂函式
- 若要客製化一些功能,就要自行定義函式。
- 語法
- 定義函式
def functionName([parameters]): """ 通常函式的註解會寫在這裡! """ statement [return value]
- 呼叫函式
functionName([parameters])
- 定義函式
規範
定義(建立)函式
必須置於呼叫(使用)函式之前!- 函式的名稱「
不能重複
」! - 函式的 parameters,可以為 0 個、1 個或多個。
- 若沒有 parameters,
( )
仍須保留。 - 若有多個 parameters,以
,
逗號隔開。parameters個數及順序均不能弄錯
。
- 若沒有 parameters,
- 函式 return 的 value,可以為 0 個、1 個或多個。
- 若
沒有 return value
,即 此函式無回傳值
的意思,但其實 隱含了回傳一個 None, 可省略不寫。 - 若有多個 return value,以
,
逗號隔開。return value個數及順序均不能弄錯
。
- 若
補充
- 如果想看到函式的註解,可以使用
print(functionName.__doc__)
假如想暫時空著且不讓執行時出錯,可使用 pass (佔位語句,表示不做任何事,是為了保持程式碼結構的完整性)。
def functionName([parameters]): pass functionName([parameters])
範例:基本版
#定義函式:定義一個印出 Hello 的程式
def sayhello():
"""
通常函式的註解會寫在這裡!
"""
print("Hello")
#呼叫函式:呼叫上方定義的函式
sayhello()
#印出函式內的註解
print(sayhello.__doc__)
範例:0 個、1 個或多個函式 parameters
- parameter:用來傳遞資料給函式。
- 沒有回傳值 = 沒有 return value,即 此函式
無回傳值
的意思,但其實 隱含了回傳一個 None, 可省略不寫。 若沒有 parameters,
( )
仍須保留。#定義函式 (沒有 parameters, 沒有回傳值) def sayhello(): print("Hello") #呼叫函式 sayhello()
若有多個 parameters,以
,
逗號隔開。parameters 個數及順序均不能弄錯。#定義函式 (有 1 個 parameters, 沒有回傳值) def say(msg): print(msg) #呼叫函式 say("Hello Python") say("Hi ~ ")
#定義函式 (有 N 個 parameters, 沒有回傳值) def add(n1, n2): result = n1 + n2 print(result) #呼叫函式 add(3, 4) add(8, 9)
範例:0 個、1 個或多個函式 return value
- return:離開函式,返回呼叫函式的地方。
- 基本上,Python 的函式都有回傳值。當我們用一個變數來接無回傳值函式的結果時,從執行結果可以看到 Python 隱含回傳了一個 None。
若有多個 return value,以
,
逗號隔開。return value 個數及順序均不能弄錯。#定義函式 (有 1 個 回傳值) def checkscore(score): if score < 0 or score > 100: return "分數超過範圍!" elif score >= 60: return "及格!" else: return "不及格!" s = eval(input("請輸入分數:")) #呼叫函式 print(checkscore(s))
#定義函式 (有 N 個 回傳值) def divmod(x, y): div = x // y mod = x % y return div, mod #呼叫函式 a, b = divmod(100, 7) print("100除以7的商數為", a, "餘數為", b) c, d = divmod(200, 13) print("200除以13的商數為", c, "餘數為", d)
匿名函式 lambda
lambda arg1, arg2, … : *expression*
lambda 參數 : 運算式
- 用來建立小的 匿名函式 (
沒有名稱的函式
)。 - 注意!lambda 運算式 不能有區塊,所以只能處理簡單的工作。
- 對於 比較複雜的工作,還是要 使用 def 定義函式 才行。
- lambda 運算式會產生一個 函式物件。
arg1, arg2, …
相當於函式定義的參數。expression
相當於函式定義的主體 (statements)。
範例
作為簡單的運算式
add = lambda x, y : x + y print(add(1, 2)) #3 print(add("abc", "de")) #abcde
當作鍵值索引
pairs = [(1, "one"), (2, "two"), (3, "three"), (4, "four")] # 根據 pair[1] 來排序:"one", "two", "three", "four" pairs.sort(key=lambda pair: pair[1]) # 方法一 new_pairs = sorted(pairs, key=lambda pair: pair[1]) # 方法二 # Output: [(4, 'four'), (1, 'one'), (3, 'three'), (2, 'two')]
遞迴函式 (Recursive function)
- 遞迴函式:可以不斷地自己呼叫自己本身的函式。
優點:邏輯性、可讀性及彈性均比迴圈來得好。
n = eval(input("n = ")) def factorial(n): if n == 0: return 1 elif n > 0: return n * factorial(n - 1) else: return "錯誤輸入!" print(n, "! = ", factorial(n))
💡 遞迴函式通常可以被 for 或 while 迴圈取代。 n = eval(input("n = ")) result = 1 for i in range(1, n + 1): result = result * i print(n, "! = ", result)