查看全课大纲(第 50 / 51 节)
  1. 1.Python 是什么?为什么值得学?
  2. 2.如何为 Python 编程准备一个“全家桶”环境?
  3. 3.Python 有哪几种执行方法?
  4. 4.行与缩进到底有什么用?
  5. 5.注释有什么用,怎么写?
  6. 6.变量:如何给数据起个好名字?
  7. 7.运算符的优先级和常见坑点是什么?
  8. 8.Python 中,数字和布尔值究竟有哪几种?
  9. 9.输入函数 `input()` 和文件读取 `open()` 怎么用?
  10. 10.如何将程序的结果展示给用户或保存下来?
  11. 11.CSV 文件怎么读怎么写才方便?
  12. 12.列表是什么,如何创建和访问它?
  13. 13.列表的修改操作,有哪些方法?
  14. 14.列表切片为什么能取到部分元素?排序和查找又该怎么用?
  15. 15.判断语句:如何让程序根据条件做不同的事?
  16. 16.for 循环如何遍历序列中的元素?
  17. 17.while 循环什么时候才会停?
  18. 18.while 循环的结束条件,你写对了吗?
  19. 19.循环中途想提前结束,怎么办?
  20. 20.`break` 和 `continue` 到底有什么区别?
  21. 21.列表推导式如何让代码更简洁高效?
  22. 22.字符串怎么定义、拼接和操作?
  23. 23.元组:为什么定义单个元素时要加逗号?
  24. 24.集合(set)怎么用?如何快速去重和做集合运算?
  25. 25.字典是什么,为什么比列表更方便?
  26. 26.字典的增删改查与遍历,如何避免 KeyError?
  27. 27.函数里的变量,为什么有的能用有的不能用?
  28. 28.在函数内部修改全局变量,为什么有时不生效?
  29. 29.函数里能修改全局变量吗?返回值怎么用?
  30. 30.匿名函数:如何用 lambda 快速定义简单函数?
  31. 31.面向对象编程是什么,为什么需要它?
  32. 32.类中的方法和属性到底怎么定义和使用?
  33. 33.如何控制对对象内部属性和方法的访问?
  34. 34.异常发生时,程序会怎样继续执行?
  35. 35.如何组织代码:包和模块
  36. 36.`if __name__ == '__main__'` 到底有什么用?
  37. 37.如何用 IDE 的 Debug 功能排查程序错误?
  38. 38.Matplotlib 绘图的第一步该做什么?
  39. 39.Figure 是什么,如何设置图形尺寸?
  40. 40.如何自定义 Matplotlib 的坐标轴?
  41. 41.如何为图表添加图例,让不同曲线一目了然?
  42. 42.饼图怎么画才能直观展示数据占比?
  43. 43.如何用 Matplotlib 绘制散点图?
  44. 44.柱状图怎么画?
  45. 45.如何使用 Matplotlib 绘制等高线图?
  46. 46.如何在 Matplotlib 中绘制子图?
  47. 47.zip 函数如何把多个列表“打包”在一起?
  48. 48.如何给可迭代对象加上索引?
  49. 49.random 模块如何生成随机数?
  50. 50.math 模块怎么用?
  51. 51.Counter 如何快速统计元素出现次数?

math 模块怎么用?

约 2 分钟

小象实战讲义 · Python 编程从入门到实践

写程序时经常要做数学计算:求平方根、取圆周率、算三角函数等。Python 内置的 math 模块提供了这些常用函数和常数,不需要额外安装。本节是第 6 章《一些常用的函数》的第 4 节,你会学到如何导入 math、怎样查看它提供了哪些功能,并把它和之前学过的 matplotlib 结合起来画一条函数曲线。

💡 核心导读

  • 导入:import math 之后,用 math.函数名 调用。
  • 查功能:dir(math) 可以列出模块里的所有名称。
  • 常用成员:常数 math.pi、函数 math.sqrt() 等。
  • 实践:用 math.sqrt 计算一组 y 值,再用 matplotlib 画出 y = sqrt(x) 的曲线。

导入 math 模块并查看功能

math 是一个工具包,主要提供常用的数学运算函数。和其他模块一样,先导入再使用:

import math

导入后如果不知道它有哪些功能,可以用 dir() 把模块里的名称列出来。不同 Python 版本的条目会略有差异,所以下面不直接打印整个列表,而是先确认几个常用名字是否存在,再实际取用常数和函数:

import math

# dir() 返回模块内所有名称组成的列表
all_names = dir(math)
print(type(all_names))

# 只检查几个常用名字是否在列表里,避免输出随版本变化
for name in ['pi', 'sqrt', 'sin', 'log']:
    status = '有' if name in all_names else '无'
    print('{}: {}'.format(name, status))

# 访问圆周率常数
print(math.pi)

# 求 4 的平方根
print(math.sqrt(4))
<class 'list'>
pi: 有
sqrt: 有
sin: 有
log: 有
3.141592653589793
2.0

输出里 有 表示该名字确实存在于 math 模块中。模块内的名称通过 math. 前缀访问:math.pi 是圆周率,math.sqrt(x) 返回 x 的平方根,结果是一个浮点数。

结合 matplotlib 绘制 y = sqrt(x)

math 负责计算,matplotlib 负责画图。下面把 0 到 199 的每个整数代入 math.sqrt 得到 y 值,再画成曲线:

import math
import matplotlib
matplotlib.use('Agg')  # 使用不弹窗的后端,保证无图窗环境也能运行
import matplotlib.pyplot as plt

# x 取 0 到 199 的整数
X = list(range(0, 200))
# 对每个 x 求平方根,得到对应的 y
Y = [math.sqrt(x) for x in X]

plt.figure(figsize=(5, 5))
plt.plot(X, Y)
plt.close()  # 释放图形资源
print('已绘制 y = sqrt(x) 的函数图像,共', len(X), '个点')
已绘制 y = sqrt(x) 的函数图像,共 200 个点

代码做了三件事:构造 x 列表、用列表推导式逐个求平方根得到 y 列表、把 (X, Y) 交给 plot 连成曲线。这条曲线就是 y = sqrt(x)。代码里用 plt.close() 释放图形;如果你想在本机窗口里看图,可以在 plot 之后改用 plt.show()。

📝 动手练一练

  1. 一个直角三角形的两条直角边分别是 3 和 4,请用 math 模块计算斜边长度。
👉 点击查看参考答案

思路:勾股定理是 c = sqrt(a ** 2 + b ** 2),用 math.sqrt 对平方和开方即可。

import math

a = 3
b = 4
c = math.sqrt(a ** 2 + b ** 2)
print('直角边为 {} 和 {} 的三角形,斜边长度为:{}'.format(a, b, c))
直角边为 3 和 4 的三角形,斜边长度为:5.0

常见错误

错误写法现象或报错原因正确写法
sqrt(4)NameError: name 'sqrt' is not defined没有加 math. 前缀,当前作用域里找不到 sqrtmath.sqrt(4)
print(Pi)NameError: name 'Pi' is not defined名称大小写敏感,模块里的常数写作小写 piprint(math.pi)
math.sqrt(-1)ValueError: math domain error实数范围内负数没有平方根先判断参数不小于 0,本节不处理复数开方

小结

  1. math 是 Python 内置的数学模块,提供常用的数学函数和常数。
  2. 使用前需要 import math,之后用 math.函数名 调用。
  3. dir(math) 可以查看模块提供的所有名称。
  4. math.pi 是圆周率常数,math.sqrt(x) 返回 x 的平方根(浮点数)。
  5. math 的多数函数面向实数运算,参数超出定义域(如对负数开平方)会抛出 ValueError。

📋 行动清单

  • 导入 math 后执行 dir(math),从中挑两个没用过的函数试调用一次。
  • 把绘图示例里的 math.sqrt 换成 math.sin,重新运行,观察代码是否仍然能跑通。
  • 用 math.pi 计算半径为 5 的圆的面积(pi * r ** 2)和周长(2 * pi * r)。

—— 小象教研组

配套资料 · 直接下载

课件、代码、数据集等配套资料全部免费,点击即可直接下载,无需分享或解锁。

  • 第6章代码包:math(含1 个 Notebook)
    ZIP · 556B
    下载