19 Python 中的函式
函式是具有某種特定功能的程式碼塊,可以重複使用。在前面的學習中你已經認識到了很多 Python 的內建函式。這節課我們就來建立我們自己的函式:
1. 重複性的程式碼
1.1 什麼是重複性的程式碼
在處理功能相似的邏輯時,會出現結構雷同的程式碼,例如:有兩個列表,編寫程式分別列印這兩個列表,程式碼如下:
案例演示 預覽 複製 複製成功!a = [1, 2, 3]
b = [10, 20, 30]
# 列印輸出列表 a 的相關資訊
print('length of list is %d' % len(a))
i = 0
while i < len(a):
print(a[i])
i = i + 1
# 列印輸出列表 b 的相關資訊
print('length of list is %d' % len(b))
i = 0
while i < len(b):
print(b[i])
i = i + 1
執行案例 點選 "執行案例" 可檢視線上執行效果 - 在第 1 行,列表 a 包含 3 個元素,現在希望列印輸出列表 a
- 在第 2 行,列表 b 包含 3 個元素,現在希望列印輸出列表 b
- 在第 4 行至第 9 行,使用 while 迴圈列印輸出列表 a
- 在第 11 行至第 16 行,使用 while 迴圈列印輸出列表 b
很顯然,列印列表 a 的程式碼與列印列表 b 的程式碼非常相似,這兩段程式碼被稱為重複性的程式碼。
1.2 可維護性差
程式碼的重複性導致程式的可維護性差,當需要修改處理邏輯時,則需要在多處進行修改。
上面的例子程式輸出結果為:
length of list is 3
1
2
3
length of list is 3
10
20
30
現在希望調整程式的輸出結果,輸出列表元素時,同時輸出元素的下標,如下所示:
length of list is 3
list[ 0] = 1
list[1] = 2
list[2] = 3
length of list is 3
list[0] = 10
list[1] = 20
list[2] = 30
為了實現這樣的需求變更,需要修改原有的程式,如下所示:
案例演示 預覽 複製 複製成功!a = [1, 2, 3]
b = [10, 20, 30]
# 列印輸出列表 a 的相關資訊
print('length of list is %d' % len(a))
i = 0
while i < len(a):
print('list[%d] = %d' % (i, a[i])) # 修改此行
i = i + 1
# 列印輸出列表 b 的相關資訊
print('length of list is %d' % len(b))
i = 0
while i < len(b):
print('list[%d] = %d' % (i, b[i])) # 修改此行
i = i + 1
執行案例 點選 "執行案例" 可檢視線上執行效果 - 在第 8 行,修改原有的 print(a[i]) 語句
- 在第 15 行,修改原有的 print(b[i]) 語句
可以看出,當列印輸出列表的功能需求變化時,則需要在多處進行修改。
2. 函式的定義
函式是可重複使用的,用來實現單一功能的程式碼段。 使用函式描述程式中功能相似的程式碼段,從而消除程式碼的重複性。函式定義的語法如下:
def 函式名(引數列表):
函式體
定義一個函式時使用 def 語句,依次寫出函式名、引數列表和冒號,然後,在縮排塊中編寫函式體。一個列印兩個數之間的最大值的例子如下:
案例演示 預覽 複製 複製成功!def max(a, b):
if a > b:
print(a)
else:
print(b)
max(1, 2)
max(20, 10)
執行案例 點選 "執行案例" 可檢視線上執行效果 執行該程式,輸出如下:
2
20
- 在第 1 行,使用 def 關鍵字定義函式 max,函式 max 有兩個引數 a 和 b
- 在第 2 行到第 5 行,定義了函式體,使用 if 語句列印引數 a 和 b 之間的較大者
- 在第 7 行,max(1, 2) 呼叫函式 max,將引數 a 設定為 1、引數 b 設定為 2,執行第 2 行到第 5 行的函式體,執行輸出結果為 2
- 在第 8 行,max(20, 10) 呼叫函式 max,將引數 a 設定為 20、引數 b 設定為 10,執行第 2 行到第 5 行的函式體,執行輸出結果為 20
3. 消除重複性的程式碼
3.1 消除重複性的程式碼
在第 1 小節的例子中,編寫程式分別列印兩個列表,程式使用了兩段重複性程式碼實現列印兩個列表。通過使用函式,可以消除程式中重複性的程式碼,如下所示:
案例演示 預覽 複製 複製成功!# 列印輸出列表 x 的相關資訊
def print_list(x):
print('length of list is %d' % len(x))
i = 0
while i < len(x):
print(x[i])
i = i + 1
a = [1, 2, 3]
b = [10, 20, 30]
print_list(a)
print_list(b)
執行案例 點選 "執行案例" 可檢視線上執行效果 - 在第 2 行,使用 def 關鍵字定義函式 print_list,函式 print_list 有一個引數 x
- 在第 3 行到第 7 行,定義了函式體,引數 x 表示一個列表,函式功能是列印引數 x 對應的列表
- 在第 9 行,列表 a 包含 3 個元素,現在希望列印輸出列表 a
- 在第 10 行,列表 b 包含 3 個元素,現在希望列印輸出列表 b
- 在第 12 行,print_list(a) 呼叫函式 print_list,將引數 x 設定為 a,列印列表 a
- 在第 13 行,print_list(b) 呼叫函式 print_list,將引數 x 設定為 b,列印列表 b
3.2 提高可維護性
上面的例子程式輸出結果為:
length of list is 3
1
2
3
length of list is 3
10
20
30
現在希望調整程式的輸出結果,輸出列表元素時,同時輸出元素的下標,如下所示:
length of list is 3
list[0] = 1
list[1] = 2
list[2] = 3
length of list is 3
list[0] = 10
list[1] = 20
list[2] = 30
為了實現這樣的需求變更,需要修改原有的程式,如下所示:
案例演示 預覽 複製 複製成功!# 列印輸出列表 x 的相關資訊
def print_list(x):
print('list[%d] = %d' % (i, x[i])) # 修改此行
i = 0
while i < len(x):
print(x[i])
i = i + 1
a = [1, 2, 3]
b = [10, 20, 30]
print_list(a)
print_list(b)
執行案例 點選 "執行案例" 可檢視線上執行效果 - 在第 3 行,修改原有的 print(x[i]) 語句。
函式 print_list 定義了列印列表的功能邏輯,因此當列印列表的功能需求變化時,只需要在函式的定義處進行修改即可,不需要在多處進行修改,從而提高了程式的可維護性。
4. 函式的返回
4.1 return 語句
Python 提供了 return 語句用於從函式中返回,當程式執行到 return 語句時,程式從函式中返回到呼叫函式的地方,舉例如下:
案例演示 預覽 複製 複製成功!def test():
print('Before return')
return
print('After return') # 這條語句不會被執行
print('Before test')
test()
print('After test')
執行案例 點選 "執行案例" 可檢視線上執行效果 程式執行時,輸出如下:
Before test
Before return
After test
從程式的輸出可以看出,程式中的第 4 行程式碼 print(‘After return’) 沒有被執行,當程式執行第 3 行的 return 語句時,會終止函式的執行,返回呼叫函式的地方。
return 語句有兩個常見的用途:
- 提前退出函式
- 向函式的呼叫者返回值
4.2 提前退出函式
通常情況下,函式執行到最後一條語句時退出函式的執行,但某些情況下,可以通過 return 語句提前退出函式。例如,編寫一個函式 check,根據性別和年齡進行處理,該函式僅處理 age > 50 的男性,忽略女性和年輕人,處理的程式碼如下:
案例演示 預覽 複製 複製成功!def check(gender, age):
if gender == 'female':
return
if age < 50:
return
print('We only process old man')
print(gender)
print(age)
執行案例 點選 "執行案例" 可檢視線上執行效果 - 在第 1 行,定義了函式 check,具有兩個引數 gender 和 age
- 在第 2 行,檢查 gender 是否等於 ‘female’
- 在第 3 行,如果是的,則忽略,通過 return 語句提前返回
- 在第 2 行,檢查 age 是否小於 50
- 在第 3 行,如果是的,則忽略,通過 return 語句提前返回
- 在第 7 行到第 9 行,對 age > 50 的男性進行處理
4.3 函式的返回值
return 語句可以攜帶引數,該引數作為函式的計算結果返回給呼叫者,語法如下:
return 返回值
下面編寫一個程式計算從 1 到 N 的累加和,程式碼如下:
案例演示 預覽 複製 複製成功!def compute(N):
sum = 0
i = 1
while i <= N:
sum = sum + i
i = i + 1
return sum
sum = compute(100)
print(sum)
執行案例 點選 "執行案例" 可檢視線上執行效果 - 在第 1 行,定義函式 compute(n),函式計算從 1 到 N 的累加和
- 在第 2 行到第 6 行,函式計算從 1 到 N 的累加和,將累加和儲存到變數 sum 中
- 在第 7 行,通過 return 語句將計算結果返回給呼叫者
- 在第 9 行,呼叫函式 compute(100) 計算從 1 累加到 100,將 compute 函式的返回結果儲存到變數 sum 中
- 在第 10 行,列印計算結果,計算結果為 5050
5. 小結
這節課我們主要學習了什麼是函式,以及在 Python 中函式如何定義,和函式的返回值等一些函式的基本內容,大家要多多練習本節課中的程式碼。函式在 Python 程式設計中是非常重要的一個知識點,學好了函式的使用會讓你在工作中事半功倍。