Python: 数学与统计
数值计算是编程的基本功。Python 的标准库提供了从基础数学函数到统计分析、从精确十进制到分数运算的全套工具。这一课让你学会在合适的场景用合适的模块。
1. math——数学函数
PYTHON
import math
# 常用常量
print(math.pi) # 3.141592653589793
print(math.e) # 2.718281828459045
# 取整
print(math.ceil(3.14)) # 4(向上取整)
print(math.floor(3.14)) # 3(向下取整)
# 幂和对数
print(math.pow(2, 10)) # 1024.0(2的10次方)
print(math.sqrt(16)) # 4.0(平方根)
print(math.log(100, 10)) # 2.0(以10为底的对数)
# 三角函数
print(math.sin(math.pi / 2)) # 1.0
print(math.cos(0)) # 1.0
print(math.radians(180)) # 3.14159...(角度→弧度)
▶ 示例:距离计算(难度⭐)
PYTHON
import math
def distance(x1, y1, x2, y2):
"""计算两点之间的距离"""
return math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2)
def circle_area(radius):
"""计算圆的面积"""
return math.pi * radius ** 2
print(f"两点距离:{distance(0, 0, 3, 4):.2f}") # 5.00
print(f"圆面积:{circle_area(5):.2f}") # 78.54
输出:
TEXT
📖 仅展示
# 函数定义成功
2. statistics——统计分析
PYTHON
import statistics
data = [12, 15, 18, 20, 22, 25, 30, 35, 40]
# 集中趋势
print(statistics.mean(data)) # 24.11(平均数)
print(statistics.median(data)) # 22(中位数)
# print(statistics.mode(data)) # 众数(数据无重复时会报错)
# 离散程度
print(statistics.stdev(data)) # 9.32(样本标准差)
print(statistics.variance(data)) # 86.86(样本方差)
▶ 示例:成绩分析(难度⭐⭐)
PYTHON
import statistics
scores = [85, 92, 78, 90, 88, 76, 95, 82, 89, 73]
print("=== 成绩分析 ===")
print(f"平均分:{statistics.mean(scores):.1f}")
print(f"中位数:{statistics.median(scores)}")
print(f"最高分:{max(scores)}")
print(f"最低分:{min(scores)}")
print(f"标准差:{statistics.stdev(scores):.2f}")
# 按标准差定等级
mean = statistics.mean(scores)
std = statistics.stdev(scores)
print("\n=== 等级分布 ===")
for score in sorted(scores, reverse=True):
if score > mean + std:
level = "优秀 ⭐"
elif score > mean:
level = "良好 👍"
elif score > mean - std:
level = "中等"
else:
level = "需努力 💪"
print(f" {score:3d} —— {level}")
输出:
TEXT
📖 仅展示
=== 成绩分析 ===
\n=== 等级分布 ===
▶ 示例:统计模块实战(难度⭐⭐)
PYTHON
import statistics
temps_beijing = [2, 5, 12, 20, 26, 31, 32, 30, 25, 16, 8, 3]
temps_shanghai = [5, 6, 10, 16, 22, 26, 30, 30, 26, 20, 13, 7]
print("=== 城市气温统计 ===")
for city, temps in [("北京", temps_beijing), ("上海", temps_shanghai)]:
mean_val = statistics.mean(temps)
median_val = statistics.median(temps)
stdev_val = statistics.stdev(temps)
print(f"\n{city}:")
print(f" 年均温:{mean_val:.1f}°C")
print(f" 中位数:{median_val:.1f}°C")
print(f" 标准差:{stdev_val:.1f}°C")
print(f" 波动范围:{mean_val - stdev_val:.1f}°C ~ {mean_val + stdev_val:.1f}°C")
输出:
TEXT
📖 仅展示
=== 城市气温统计 ===
北京:
年均温:17.7°C
中位数:18.0°C
标准差:10.8°C
波动范围:6.8°C ~ 28.5°C
上海:
年均温:17.6°C
中位数:18.0°C
标准差:9.4°C
波动范围:8.2°C ~ 27.0°C
3. decimal——精确小数
PYTHON
from decimal import Decimal, getcontext
# float 的精度问题
print(0.1 + 0.2) # 0.30000000000000004 ❌
# Decimal 精确计算
print(Decimal("0.1") + Decimal("0.2")) # 0.3 ✅
# 设置精度
getcontext().prec = 4 # 全局精度为 4 位
print(Decimal(1) / Decimal(3)) # 0.3333(4位精度)
# 金额计算必须用 Decimal
price = Decimal("19.99")
quantity = Decimal("3")
tax_rate = Decimal("0.08")
total = price * quantity
tax = total * tax_rate
print(f"总价:{total:.2f}") # 59.97
print(f"税费:{tax:.2f}") # 4.80
print(f"应付:{total + tax:.2f}") # 64.77
💡 处理金额永远用
Decimal,不要用 float。 0.1 + 0.2 的精度问题在金融计算中是致命的。Decimal 牺牲了一点性能,换来了精确的十进制计算。
4. fractions——分数运算
PYTHON
from fractions import Fraction
# 创建分数
f1 = Fraction(1, 3) # 1/3
f2 = Fraction(2, 6) # 自动约分为 1/3
print(f1) # 1/3
print(f2) # 1/3
print(f1 == f2) # True
# 分数运算
a = Fraction(1, 2)
b = Fraction(1, 3)
print(a + b) # 5/6
print(a * b) # 1/6
print(a / b) # 3/2
# 分数和浮点数互转
print(float(Fraction(1, 3))) # 0.3333333333
print(Fraction(0.25).limit_denominator()) # 1/4
5. 常见应用场景
- math:几何计算(面积/体积)、三角函数、对数运算。
- statistics:考试成绩分析、数据报表、科学实验数据处理。
- decimal:电商价格计算、财务报表、税率计算。
- fractions:食谱配方、工程比例、教育类应用。
❓ 常见问题
Q
math 模块和内置的 abs()、round()、sum() 有什么区别?A 内置函数处理基本操作(绝对值、四舍五入、求和),
math 提供更专业的数学函数(三角函数、对数、阶乘)。能用内置函数解决的就不用 math。Q
statistics 模块的 mean() 和手动算平均有什么区别?A
mean() 内部做了优化(一次遍历同时求和和计数),比 sum(data) / len(data) 性能更好(大数据量时),也应该处理了空列表和特殊值。Q 什么时候用
Fraction 而不是 Decimal?A 需要精确的有理数运算时用
Fraction(如教育软件中的分数练习题)。需要精度可控的十进制计算时用 Decimal(如金融计算)。简单场景 float 就够了——99% 的日常编程用不到这两个模块。📖 小节
math:ceil()/floor()取整、sqrt()平方根、pi/e常量、三角函数statistics:mean()平均、median()中位数、stdev()标准差Decimal:精确十进制,适合金融计算,从字符串创建(Decimal("0.1"))Fraction:精确分数运算,自动约分
📝 作业
-
基础题(难度⭐):用
math模块计算半径为 7 的圆的面积和周长。 -
进阶题(难度⭐⭐):给定一组数据
data = [23, 45, 67, 12, 34, 56, 78, 90, 11, 43],用statistics模块计算平均、中位数、标准差,然后用math判断每个数据是否在"平均数 ± 标准差"的范围内。 -
挑战题(难度⭐⭐⭐):写一个"购物车结算"程序。商品有名称、单价(
Decimal)、数量。用户添加商品后,计算总价、税费(8%)、折扣(满100减10),输出最终应付金额。要求:所有金额用Decimal计算。