Python 函数返回值:让代码真正“产出结果”
✨ 从只会打印到学会返回,函数进阶核心一章
6. 返回值
前面我们写的函数大多只是打印或画图,不会产出可继续使用的结果。 本章你将学会:
6.1 函数可以有返回值
使用 return 把计算结果返回,可以赋值给变量、参与运算。
import math# 定义函数:计算圆面积,返回结果defcircle_area(radius):# 计算面积 area = math.pi * radius ** 2# 返回面积return area
# 调用函数,直接显示返回值circle_area(3.656)
运行结果:
42.00000000000001
# 将返回值赋值给变量a = circle_area(3.656)print(a)
运行结果:
42.00000000000001
注意:局部变量外部无法访问
# 错误:area 是函数内局部变量print(area)
运行结果:
NameError: name 'area' is not defined
6.2 没有 return 就返回 None
如果函数末尾没有 return,会默认返回 None(空值)。
# 只打印,不 returndefrepeat(word, n):print(word * n)# 调用并把返回值存到 resultresult = repeat('Finland, ', 3)
运行结果:
Finland, Finland, Finland,
# 查看返回值:Noneprint(result)
运行结果:
None
纯函数(只返回,不打印)
# 纯函数:只返回拼接后的字符串defrepeat_string(word, n):return word * nline = repeat_string('Spam, ', 4)print(line)
运行结果:
'Spam, Spam, Spam, Spam, '
6.3 返回值与条件判断
return 会立即结束函数。 条件分支中要保证所有路径都有 return。
# 正确:绝对值函数defabsolute_value(x):if x < 0:return -xelse:return x
# 错误:x=0 时没有 returndefabsolute_value_wrong(x):if x < 0:return -xif x > 0:return xprint(absolute_value_wrong(0))
运行结果:
None
死代码(永远执行不到)
defabsolute_value_extra_return(x):if x < 0:return -xelse:return x# 永远不会执行return'This is dead code'
6.4 增量开发(超级实用的写代码方法)
写一点、测一点,避免一次写太多难以调试。
示例:计算两点间距离 公式:distance = √[(x2-x1)² + (y2-y1)²]
步骤1:搭框架
defdistance(x1, y1, x2, y2):return0.0
步骤2:算差值
defdistance(x1, y1, x2, y2): dx = x2 - x1 dy = y2 - y1print('dx=', dx, 'dy=', dy)return0.0
步骤3:算平方和
defdistance(x1, y1, x2, y2): dx = x2 - x1 dy = y2 - y1 dsquared = dx**2 + dy**2print('dsquared=', dsquared)return0.0
步骤4:算平方根并返回
defdistance(x1, y1, x2, y2): dx = x2 - x1 dy = y2 - y1 dsquared = dx**2 + dy**2 result = math.sqrt(dsquared)return result
# 测试:(1,2) 到 (4,6) 距离应为 5distance(1, 2, 4, 6)
运行结果:
5.0
6.5 布尔函数(返回 True/False)
常用于封装判断条件。
# 判断 x 是否能被 y 整除defis_divisible(x, y):return x % y == 0
print(is_divisible(6, 3))print(is_divisible(6, 4))
运行结果:
TrueFalse
直接用于条件判断:
if is_divisible(6, 2):print('可整除')
6.6 带返回值的递归
递归 + 返回值 = 图灵完备(能计算任何可计算问题)。 0!=1n!=n(n−1)!
阶乘函数
# 计算 n!deffactorial(n):# 基线条件if n == 0:return1# 递归条件else:return n * factorial(n-1)
print(factorial(3))
运行结果:
6
6.8 斐波那契数列
deffibonacci(n):if n == 0:return0elif n == 1:return1else:return fibonacci(n-1) + fibonacci(n-2)
print(fibonacci(6))
运行结果:
8
6.9 类型检查(避免非法参数)
用 isinstance 检查类型,防止无限递归。
deffactorial(n):# 检查是否为整数ifnotisinstance(n, int):print('factorial 仅支持整数')returnNone# 检查是否非负elif n < 0:print('factorial 不支持负数')returnNoneelif n == 0:return1else:return n * factorial(n-1)
factorial(1.5)factorial(-2)
运行结果:
factorial 仅支持整数factorial 不支持负数
6.10 调试技巧
# 带调试打印的阶乘deffactorial(n): space = ' ' * (4 * n)print(space, f'factorial({n})')if n == 0:print(space, 'return 1')return1else: res = factorial(n-1)print(space, f'return {n * res}')return n * resfactorial(3)
运行结果:
factorial(3) factorial(2) factorial(1) factorial(0) return 1 return 1 return 2 return 66
6.11 术语表
6.12 练习
- 用增量开发写
hypot(a,b) 求直角三角形斜边 - 写布尔函数
is_between(x,y,z) 判断 y 是否在 x 和 z 之间