
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语句返回。