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('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]) 语句。

函数 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 编程中是非常重要的一个知识点,学好了函数的使用会让你在工作中事半功倍。