零基础学Python(第2版)
上QQ阅读APP看书,第一时间看更新

5.3.3 函数的返回值

函数的返回使用return语句,return后面可以是变量或表达式。下面通过【例5-7】完善一下arithmetic(),添加return语句。

【例5-7.py】


01     from __future__ import division     # 导入division模块
02     def arithmetic(x, y, operator):     # 定义arithmetic函数
03         result = {
04             "+" : x + y,
05             "-" : x - y,
06             "*" : x * y,
07             "/" : x / y
08         }
09         return result.get(operator)          # 调用get返回计算结果

【代码说明】第9行代码调用字典的get(),获得对应的表达式,并把计算后的结果返回。

对于C、Java,如果函数主体没有使用return语句返回,而在赋值语句中调用函数,程序编译后会出现错误。Python没有这个语法限制,即使函数没有返回值,依然可以获得返回值。例如:


01     # 没有return语句的函数返回None
02     def func():
03         pass
04
05     print (func())

【代码说明】

·第2行代码定义了一个函数func(),函数的主体没有任何实现代码,pass关键字相当于一个占位符。

·第5行代码输出func()的返回值,因为没有return语句,所以返回值为None。输出结果为“None”。

None是Python中的对象,不属于数字也不属于字符串。当函数中的return语句不带任何参数时,返回的结果也是None。


01     def func():
02         return
03
04     print (func())

如果需要返回多个值,可以把这些值“打包”到元组中。在调用时,对返回的元组“解包”即可。下面【例5-8】这段代码实现了输入变量的反转。例如,输入0、1、2,返回2、1、0。

【例5-8.py】


01     # return返回多个值
02     def func(x, y, z):
03         l = [x, y, z]
04         l.reverse()
05         numbers = tuple(l)
06         return numbers
07
08     x, y, z = func(0, 1, 2)
09     print (x, y, z)

【代码说明】

·第2行代码定义了一个函数func(),该函数对传入的3个参数反转后,返回这3个值。

·第3行代码把3个参数“打包”到一个列表中。

·第4行代码反转列表。

·第5行代码把列表装到一个元组中。

·第6行代码返回元组,即返回了3个数字。

·第8行代码调用func(),获得返回的元组,并“解包”到3个变量中。

·第9行代码输出3个变量的值。

下面通过【例5-9】稍微改进一下代码,还可以得到第二种解决办法。

【例5-9.py】


01     def func(x, y, z):                 # 定义func函数
02         l = [x, y, z]                   # 定义l列表
03         l.reverse()                     # 调用reverse方法
04         a, b, c = tuple(l)
05         return a, b, c
06
07     x, y, z = func(0, 1, 2)
08     print (x, y, z)

【代码说明】

·第4行代码“解包”元组,把反转后的值分别赋值给变量a、b、c。

·第5行代码,return后可以跟逗号间隔的表达式,返回多个值。

·第7行代码调用func(),把a、b、c分别赋值给x、y、z。

函数中可以使用多个return语句。例如,if…else…语句的各个分支中,返回不同的结果。下面通过【例5-10】的代码实现。

【例5-10.py】


01     # 多个return语句
02     def func(x):                         # 定义func函数
03         if x > 0:                         # if判断
04             return "x > 0"
05         elif x == 0:
06             return "x == 0"
07         else:
08             return "x < 0"
09
10     print (func(-2))

【代码说明】当传入的参数大于0时,返回“x>0”;当传入的参数等于0时,返回“x==0”;当传入的参数小于0,返回“x<0”。

注意 多个return语句是不推荐的写法,过多的return语句往往造成程序复杂化,这时就需要对代码进行重构了。

如果程序中有多个return语句,可以通过增加一个变量的方法,减少return语句。下面通过【例5-11】的代码实现。

【例5-11.py】


01     # 多个return语句的重构
02     def func(x):
03         if x > 0:
04             result = "x > 0"
05         elif x == 0:
06             result = "x == 0"
07         else:
08             result = "x < 0"
09         return result
10
11     print (func(-2))

【代码说明】

·第4、6、8行代码,增加了一个变量result,通过赋值语句来记录程序分支的状况。

·第9行代码返回result的值,这样就使得每个分支的结果都可以调用同一个return语句返回。