Python 中的函數(shù)
函數(shù)是具有某種特定功能的代碼塊,可以重復(fù)使用。在前面的學(xué)習(xí)中你已經(jīng)認(rèn)識(shí)到了很多 Python 的內(nèi)置函數(shù)。這節(jié)課我們就來創(chuàng)建我們自己的函數(shù):
1. 重復(fù)性的代碼
1.1 什么是重復(fù)性的代碼
在處理功能相似的邏輯時(shí),會(huì)出現(xiàn)結(jié)構(gòu)雷同的代碼,例如:有兩個(gè)列表,編寫程序分別打印這兩個(gè)列表,代碼如下:
a = [1, 2, 3]
b = [10, 20, 30]
# 打印輸出列表 a 的相關(guān)信息
print('length of list is %d' % len(a))
i = 0
while i < len(a):
print(a[i])
i = i + 1
# 打印輸出列表 b 的相關(guān)信息
print('length of list is %d' % len(b))
i = 0
while i < len(b):
print(b[i])
i = i + 1
- 在第 1 行,列表 a 包含 3 個(gè)元素,現(xiàn)在希望打印輸出列表 a
- 在第 2 行,列表 b 包含 3 個(gè)元素,現(xiàn)在希望打印輸出列表 b
- 在第 4 行至第 9 行,使用 while 循環(huán)打印輸出列表 a
- 在第 11 行至第 16 行,使用 while 循環(huán)打印輸出列表 b
很顯然,打印列表 a 的代碼與打印列表 b 的代碼非常相似,這兩段代碼被稱為重復(fù)性的代碼。
1.2 可維護(hù)性差
代碼的重復(fù)性導(dǎo)致程序的可維護(hù)性差,當(dāng)需要修改處理邏輯時(shí),則需要在多處進(jìn)行修改。
上面的例子程序輸出結(jié)果為:
length of list is 3
1
2
3
length of list is 3
10
20
30
現(xiàn)在希望調(diào)整程序的輸出結(jié)果,輸出列表元素時(shí),同時(shí)輸出元素的下標(biāo),如下所示:
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
為了實(shí)現(xiàn)這樣的需求變更,需要修改原有的程序,如下所示:
a = [1, 2, 3]
b = [10, 20, 30]
# 打印輸出列表 a 的相關(guān)信息
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 的相關(guān)信息
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]) 語句
可以看出,當(dāng)打印輸出列表的功能需求變化時(shí),則需要在多處進(jìn)行修改。
2. 函數(shù)的定義
函數(shù)是可重復(fù)使用的,用來實(shí)現(xiàn)單一功能的代碼段。 使用函數(shù)描述程序中功能相似的代碼段,從而消除代碼的重復(fù)性。函數(shù)定義的語法如下:
def 函數(shù)名(參數(shù)列表):
函數(shù)體
定義一個(gè)函數(shù)時(shí)使用 def 語句,依次寫出函數(shù)名、參數(shù)列表和冒號(hào),然后,在縮進(jìn)塊中編寫函數(shù)體。一個(gè)打印兩個(gè)數(shù)之間的最大值的例子如下:
def max(a, b):
if a > b:
print(a)
else:
print(b)
max(1, 2)
max(20, 10)
運(yùn)行該程序,輸出如下:
2
20
- 在第 1 行,使用 def 關(guān)鍵字定義函數(shù) max,函數(shù) max 有兩個(gè)參數(shù) a 和 b
- 在第 2 行到第 5 行,定義了函數(shù)體,使用 if 語句打印參數(shù) a 和 b 之間的較大者
- 在第 7 行,max (1, 2) 調(diào)用函數(shù) max,將參數(shù) a 設(shè)定為 1、參數(shù) b 設(shè)定為 2,執(zhí)行第 2 行到第 5 行的函數(shù)體,執(zhí)行輸出結(jié)果為 2
- 在第 8 行,max (20, 10) 調(diào)用函數(shù) max,將參數(shù) a 設(shè)定為 20、參數(shù) b 設(shè)定為 10,執(zhí)行第 2 行到第 5 行的函數(shù)體,執(zhí)行輸出結(jié)果為 20
3. 消除重復(fù)性的代碼
3.1 消除重復(fù)性的代碼
在第 1 小節(jié)的例子中,編寫程序分別打印兩個(gè)列表,程序使用了兩段重復(fù)性代碼實(shí)現(xiàn)打印兩個(gè)列表。通過使用函數(shù),可以消除程序中重復(fù)性的代碼,如下所示:
# 打印輸出列表 x 的相關(guān)信息
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 關(guān)鍵字定義函數(shù) print_list,函數(shù) print_list 有一個(gè)參數(shù) x
- 在第 3 行到第 7 行,定義了函數(shù)體,參數(shù) x 表示一個(gè)列表,函數(shù)功能是打印參數(shù) x 對(duì)應(yīng)的列表
- 在第 9 行,列表 a 包含 3 個(gè)元素,現(xiàn)在希望打印輸出列表 a
- 在第 10 行,列表 b 包含 3 個(gè)元素,現(xiàn)在希望打印輸出列表 b
- 在第 12 行,print_list (a) 調(diào)用函數(shù) print_list,將參數(shù) x 設(shè)定為 a,打印列表 a
- 在第 13 行,print_list (b) 調(diào)用函數(shù) print_list,將參數(shù) x 設(shè)定為 b,打印列表 b
3.2 提高可維護(hù)性
上面的例子程序輸出結(jié)果為:
length of list is 3
1
2
3
length of list is 3
10
20
30
現(xiàn)在希望調(diào)整程序的輸出結(jié)果,輸出列表元素時(shí),同時(shí)輸出元素的下標(biāo),如下所示:
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
為了實(shí)現(xiàn)這樣的需求變更,需要修改原有的程序,如下所示:
# 打印輸出列表 x 的相關(guān)信息
def print_list(x):
print('length of list is %d' % len(x))
i = 0
while i < len(x):
print('list[%d] = %d' % (i, x[i])) # 修改此行
i = i + 1
a = [1, 2, 3]
b = [10, 20, 30]
print_list(a)
print_list(b)
- 在第 3 行,修改原有的 print (x [i]) 語句。
函數(shù) print_list 定義了打印列表的功能邏輯,因此當(dāng)打印列表的功能需求變化時(shí),只需要在函數(shù)的定義處進(jìn)行修改即可,不需要在多處進(jìn)行修改,從而提高了程序的可維護(hù)性。
4. 函數(shù)的返回
4.1 return 語句
Python 提供了 return 語句用于從函數(shù)中返回,當(dāng)程序執(zhí)行到 return 語句時(shí),程序從函數(shù)中返回到調(diào)用函數(shù)的地方,舉例如下:
def test():
print('Before return')
return
print('After return') # 這條語句不會(huì)被執(zhí)行
print('Before test')
test()
print('After test')
程序運(yùn)行時(shí),輸出如下:
Before test
Before return
After test
從程序的輸出可以看出,程序中的第 4 行代碼 print (‘After return’) 沒有被執(zhí)行,當(dāng)程序執(zhí)行第 3 行的 return 語句時(shí),會(huì)終止函數(shù)的執(zhí)行,返回調(diào)用函數(shù)的地方。
return 語句有兩個(gè)常見的用途:
- 提前退出函數(shù)
- 向函數(shù)的調(diào)用者返回值
4.2 提前退出函數(shù)
通常情況下,函數(shù)執(zhí)行到最后一條語句時(shí)退出函數(shù)的執(zhí)行,但某些情況下,可以通過 return 語句提前退出函數(shù)。例如,編寫一個(gè)函數(shù) check,根據(jù)性別和年齡進(jìn)行處理,該函數(shù)僅處理 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 行,定義了函數(shù) check,具有兩個(gè)參數(shù) gender 和 age
- 在第 2 行,檢查 gender 是否等于 ‘female’
- 在第 3 行,如果是的,則忽略,通過 return 語句提前返回
- 在第 2 行,檢查 age 是否小于 50
- 在第 3 行,如果是的,則忽略,通過 return 語句提前返回
- 在第 7 行到第 9 行,對(duì) age > 50 的男性進(jìn)行處理
4.3 函數(shù)的返回值
return 語句可以攜帶參數(shù),該參數(shù)作為函數(shù)的計(jì)算結(jié)果返回給調(diào)用者,語法如下:
return 返回值
下面編寫一個(gè)程序計(jì)算從 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 行,定義函數(shù) compute (n),函數(shù)計(jì)算從 1 到 N 的累加和
- 在第 2 行到第 6 行,函數(shù)計(jì)算從 1 到 N 的累加和,將累加和保存到變量 sum 中
- 在第 7 行,通過 return 語句將計(jì)算結(jié)果返回給調(diào)用者
- 在第 9 行,調(diào)用函數(shù) compute (100) 計(jì)算從 1 累加到 100,將 compute 函數(shù)的返回結(jié)果保存到變量 sum 中
- 在第 10 行,打印計(jì)算結(jié)果,計(jì)算結(jié)果為 5050
5. 小結(jié)
這節(jié)課我們主要學(xué)習(xí)了什么是函數(shù),以及在 Python 中函數(shù)如何定義,和函數(shù)的返回值等一些函數(shù)的基本內(nèi)容,大家要多多練習(xí)本節(jié)課中的代碼。函數(shù)在 Python 編程中是非常重要的一個(gè)知識(shí)點(diǎn),學(xué)好了函數(shù)的使用會(huì)讓你在工作中事半功倍。