CC++ & Algorithm

编程中的尺子与骰子:Python数学工具箱让你秒变计算高手

你有没有遇到过这种情况?在统计全班成绩时,需要找出最高分和最低分;在编写游戏时,想模拟掷骰子;或者在处理温度数据时,发现零下5度和零上5度“绝对值”其实一样冷。这些看似零散的需求,Python其实早就为你准备好了工具箱——从 absmax/min,再到 mathrandom 模块,它们就像编程界的“尺子”和“骰子”,让各种数学操作变得信手拈来。

绝对值:把“方向”扔掉,只看距离

先聊个生活场景:你欠了别人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 是尺子,那 maxmin 就是裁判——在一群数字里选出最大的和最小的。它们的用法非常直观:

# 直接传多个数字
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 返回的是浮点数,即使输入是完全平方数也会带 .0ceil 是“天花板取整”,不管小数是多少,都往大取;floor 是“地板取整”,直接砍掉小数部分。

有个经典的题目:求解方程 ax²+bx+c=0 的根。这个题就完美考察了 math.sqrtmax/min 的用法。题目要求输出两个根,大根在前,小根在后,保留两位小数。思路是先计算判别式 d = b*b - 4*a*c(题目说“无需考虑特殊情况”,我们假设有实根),然后用求根公式 (-b ± sqrt(d)) / (2*a)。最后用 maxmin 调整输出顺序,或者直接用 maxmin 处理两个根。

核心代码片段:

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。

这道题表面上看跟上面的函数关系不大,但它的核心考察的是循环和取余。不过我们可以联想一下:如果题目要求“计算两数之差的绝对值”或者“找出最大最小值”,那 absmaxmin 就能派上用场。而这道题我们需要自己实现一个数字的各位求和。思路很清楚:

  1. 将数字转为字符串或者用循环取余数。
  2. 反复求和直到结果小于10。

最关键的是要处理超大整数(小于10^1000),Python的int可以支持任意大数,直接输入字符串然后转int即可。

核心代码(使用字符串方式):

s = input().strip()
while len(s) > 1:
    s = str(sum(int(ch) for ch in s))
print(s)

这个解法相当简洁。如果数字太大,用数学取余也是一样。这道题没有用到 absmax,但它考察的是算法思维——用循环将问题降解。在学习数学函数的同时,也要掌握这种“手搓”能力。

总结与进阶

回过头看,Python的数学工具包(absmax/minmathrandom)覆盖了从基础到高级的很多场景。学会它们,就像给工具箱里添了锤子、尺子、骰子——大部分日常计算都能轻松解决。

但注意两点:

  • 这些函数只是起点,真正的能力在于知道何时用它们,何时自己写算法。
  • mathrandom 需要先 import,别忘了;否则Python会报 NameError

进阶建议:可以尝试把 mathrandom 结合起来,比如写一个蒙特卡洛方法估算圆周率的程序——这既能加深对随机数的理解,又能体验到数学模块的威力。另外,GESP二级考试中,绝对值、最大最小值几乎是必考送分题,一定要熟练掌握。


关于作者

我是赵老师,持有 NOI 信息学奥赛教练证书,拥有 15 年以上的软件开发经验,从事信息学少儿编程教学已有 8 年时间。

这些年累计帮助 多名 学生通过编程特长升入自己心仪的目标学校。

如果你在编程学习上有任何疑问,欢迎联系我:18620372957(微信同号)

这篇文章对你有帮助吗?

成为第一个评价的人

想系统学习这个知识点?查看完整知识点 →