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. 常见应用场景


❓ 常见问题

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% 的日常编程用不到这两个模块。

📖 小节


📝 作业

  1. 基础题(难度⭐):用 math 模块计算半径为 7 的圆的面积和周长。

  2. 进阶题(难度⭐⭐):给定一组数据 data = [23, 45, 67, 12, 34, 56, 78, 90, 11, 43],用 statistics 模块计算平均、中位数、标准差,然后用 math 判断每个数据是否在"平均数 ± 标准差"的范围内。

  3. 挑战题(难度⭐⭐⭐):写一个"购物车结算"程序。商品有名称、单价(Decimal)、数量。用户添加商品后,计算总价、税费(8%)、折扣(满100减10),输出最终应付金额。要求:所有金额用 Decimal 计算。

Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏