编程中的尺子与骰子:Python数学工具箱让你秒变计算高手
你有没有遇到过这种情况?在统计全班成绩时,需要找出最高分和最低分;在编写游戏时,想模拟掷骰子;或者在处理温度数据时,发现零下5度和零上5度“绝对值”其实一样冷。这些看似零散的需求,Python其实早就为你准备好了工具箱——从 abs 到 max/min,再到 math 和 random 模块,它们就像编程界的“尺子”和“骰子”,让各种数学操作变得信手拈来。
绝对值:把“方向”扔掉,只看距离
先聊个生活场景:你欠了别人10块钱,记账本上写的是 -10。如果问“你欠了多少”,我们关心的是数字大小,而不是正负号。Python的 abs() 函数做的就是这件事——它返回一个数到原点的距离,永远非负。
print(abs(-10)) # 10
print(abs(5)) # 5
print(abs(-3.14)) # 3.14
这个函数看起来简单,但用对地方能省很多事。比如在计算两个玩家得分差距时:
score1, score2 = 85, 92
diff = abs(score1 - score2) # 7,不管谁高谁低
否则你还得写 if score1 > score2: diff = score1 - score2 else: ...,多麻烦。abs 就像一把直尺,只管量长度,不管左还是右。
有一道题目问:“abs(-3.14) 的返回值是什么?”答案显然是 3.14。还有一道判断题说“abs() 只能用于整数”,这显然是错的,浮点数同样适用。实际上,它甚至可以用于复数(返回模),不过GESP二级暂时不涉及。
最大值与最小值:从一堆数字里挑“老大”和“老小”
如果说 abs 是尺子,那 max 和 min 就是裁判——在一群数字里选出最大的和最小的。它们的用法非常直观:
# 直接传多个数字
print(max(3, 5, 1, 9)) # 9
print(min(3, 5, 1, 9)) # 1
# 传入列表
scores = [85, 92, 78, 95, 88]
print(max(scores)) # 95
print(min(scores)) # 78
注意:如果传入空列表会报错,所以一定要确保至少有一个值。这两个函数还可以用于字符串(按字典序),但在二级考试中重点还是数字。
math 模块:你的数学百宝箱
当你需要开平方、取整、或者用圆周率时,Python自带的加减乘除就不够用了。这时候 math 模块登场。只要在代码开头写一句 import math,就能解锁一大堆数学工具。
来看看几个常用函数:
import math
# 平方根
print(math.sqrt(9)) # 3.0
# 向上取整和向下取整
print(math.ceil(3.1)) # 4
print(math.floor(3.9)) # 3
# 圆周率
print(math.pi) # 3.141592653589793
注意 math.sqrt 返回的是浮点数,即使输入是完全平方数也会带 .0。ceil 是“天花板取整”,不管小数是多少,都往大取;floor 是“地板取整”,直接砍掉小数部分。
有个经典的题目:求解方程 ax²+bx+c=0 的根。这个题就完美考察了 math.sqrt 和 max/min 的用法。题目要求输出两个根,大根在前,小根在后,保留两位小数。思路是先计算判别式 d = b*b - 4*a*c(题目说“无需考虑特殊情况”,我们假设有实根),然后用求根公式 (-b ± sqrt(d)) / (2*a)。最后用 max 和 min 调整输出顺序,或者直接用 max 和 min 处理两个根。
核心代码片段:
import math
a, b, c = map(float, input().split())
d = b*b - 4*a*c
x1 = (-b + math.sqrt(d)) / (2*a)
x2 = (-b - math.sqrt(d)) / (2*a)
# 输出大根和小根,保留两位小数
print(f"{max(x1, x2):.2f} {min(x1, x2):.2f}")
这里 math.sqrt 是关键,而 max/min 则避免了繁琐的 if 判断。一道题同时检验了对两个内置函数和数学模块的理解。
random 模块:给程序注入“不确定性”
如果说前面的函数都是确定性的——同样的输入永远得到同样的输出,那 random 模块就是那个制造“惊喜”的工具。它能让你的程序每次运行都不同,非常适合游戏、模拟和测试。
用法同样简单:
import random
# 0到1之间的随机小数
print(random.random()) # 比如0.374
# 生成[a, b]之间的随机整数
print(random.randint(1, 6)) # 模拟掷骰子
# 从列表里随机选一个
colors = ["红", "黄", "蓝"]
print(random.choice(colors))
random.random() 生成 [0, 1) 的浮点数,非常适合模拟概率事件。比如模拟30%降雨概率:if random.random() < 0.3: print("下雨了")。
注意:每次运行程序结果都不同,但如果你希望可复现,可以用 random.seed(42) 固定种子。不过一般不需要。
实战:数根问题——当内置函数不够用时
再看另一道题目:求一个数的数根(反复将各位数字相加直到只剩一位数)。比如 24 → 2+4=6,输出6;39 → 3+9=12 → 1+2=3,输出3。
这道题表面上看跟上面的函数关系不大,但它的核心考察的是循环和取余。不过我们可以联想一下:如果题目要求“计算两数之差的绝对值”或者“找出最大最小值”,那 abs、max、min 就能派上用场。而这道题我们需要自己实现一个数字的各位求和。思路很清楚:
- 将数字转为字符串或者用循环取余数。
- 反复求和直到结果小于10。
最关键的是要处理超大整数(小于10^1000),Python的int可以支持任意大数,直接输入字符串然后转int即可。
核心代码(使用字符串方式):
s = input().strip()
while len(s) > 1:
s = str(sum(int(ch) for ch in s))
print(s)
这个解法相当简洁。如果数字太大,用数学取余也是一样。这道题没有用到 abs 或 max,但它考察的是算法思维——用循环将问题降解。在学习数学函数的同时,也要掌握这种“手搓”能力。
总结与进阶
回过头看,Python的数学工具包(abs、max/min、math、random)覆盖了从基础到高级的很多场景。学会它们,就像给工具箱里添了锤子、尺子、骰子——大部分日常计算都能轻松解决。
但注意两点:
- 这些函数只是起点,真正的能力在于知道何时用它们,何时自己写算法。
math和random需要先import,别忘了;否则Python会报NameError。
进阶建议:可以尝试把 math 和 random 结合起来,比如写一个蒙特卡洛方法估算圆周率的程序——这既能加深对随机数的理解,又能体验到数学模块的威力。另外,GESP二级考试中,绝对值、最大最小值几乎是必考送分题,一定要熟练掌握。
关于作者
我是赵老师,持有 NOI 信息学奥赛教练证书,拥有 15 年以上的软件开发经验,从事信息学少儿编程教学已有 8 年时间。
这些年累计帮助 多名 学生通过编程特长升入自己心仪的目标学校。
如果你在编程学习上有任何疑问,欢迎联系我:18620372957(微信同号)