当前位置:首页>python>一种全新的思维方式|《Think Python》第6章

一种全新的思维方式|《Think Python》第6章

  • 2026-09-09 00:05:50
一种全新的思维方式|《Think Python》第6章

Python 函数返回值:让代码真正“产出结果”

✨ 从只会打印到学会返回,函数进阶核心一章


6. 返回值

前面我们写的函数大多只是打印或画图,不会产出可继续使用的结果。 本章你将学会:

  • 用 return 返回值
  • 纯函数、空返回值 None
  • 带返回值的条件判断
  • 增量开发法
  • 布尔函数
  • 带返回值的递归(阶乘、斐波那契)
  • 类型检查与输入验证

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 调试技巧

  1. 函数开头打印参数
  2. return 前打印结果
  3. 用缩进可视化递归过程
# 带调试打印的阶乘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 术语表

英文
中文
说明
return value
返回值
函数产出的结果
pure function
纯函数
只返回,无打印/无副作用
None
空值
无 return 时默认返回
dead code
死代码
永远执行不到的代码
incremental development
增量开发
写一点测一点
input validation
输入验证
检查参数类型/范围

6.12 练习

  1. 用增量开发写 hypot(a,b) 求直角三角形斜边
  2. 写布尔函数 is_between(x,y,z) 判断 y 是否在 x 和 z 之间
  3. 实现阿克曼函数 ackermann(m,n)
  4. 用递归实现最大公约数 gcd(a,b)

最新文章

随机文章