Skip to content

第 8 章 模块、标准库与第三方库

学习目标

  • 掌握 import 的三种写法
  • 会用常用标准库:mathrandomdatetime
  • 会用 pip 安装第三方库,了解虚拟环境
  • 能用 requests 发起 HTTP 请求并解析返回的 JSON

8.1 import:引入模块

模块是一个包含 Python 代码的文件,把相关功能打包在一起。标准库是 Python 自带的模块集合。用 import 引入:

python
import math

print(math.sqrt(16))
print(math.ceil(3.2))
print(math.floor(3.8))

输出:

4.0
4
3

import math 之后,用 math.函数名 调用,名字前面必须带模块名。

三种常见写法:

python
import math                          # 写法一:引入整个模块
from math import sqrt, pi            # 写法二:引入模块里的部分名字
import math as m                     # 写法三:起别名,之后用 m.xxx
python
from math import sqrt, pi

print(sqrt(9))
print(pi)

输出:

3.0
3.141592653589793

写法二引入后可以直接用 sqrt(9),但要注意名字可能与其他代码冲突。本书建议:多数情况用写法一或写法二,别名写法用于名字特别长的情况

8.2 常用标准库

math:数学函数与常量。

函数作用示例结果
sqrt(x)平方根math.sqrt(16)4.0
ceil(x)向上取整math.ceil(3.2)4
floor(x)向下取整math.floor(3.8)3
pi圆周率常量math.pi3.141592653589793

random:生成随机数。注意示例前先调用 random.seed(1) 固定随机种子,这样每次运行结果相同,便于教材演示;实际程序通常不加 seed。

python
import random

random.seed(1)
print(random.randint(1, 100))
print(random.choice(["苹果", "香蕉", "橘子"]))

输出(seed 固定为 1 时):

18
橘子

常用函数:randint(a, b) 返回 a 到 b(含两端)的随机整数;choice(序列) 随机取一个元素;shuffle(列表) 原地打乱顺序。

datetime:日期与时间。

python
from datetime import date

d = date(2026, 8, 2)
print(d)
print(d.year, d.month, d.day)

输出:

2026-08-02
2026 8 2

8.3 pip 与第三方库

第三方库是社区开发、通过包管理器 pip 安装的模块。安装命令:

$ pip install requests

安装后即可像标准库一样使用。用 pip list 查看已安装的库,pip uninstall 库名 卸载。

requests 是发起 HTTP 请求最常用的第三方库。下面请求一个公开 API 并解析返回的 JSON(需要联网,输出取决于接口当时的返回):

python
import requests

resp = requests.get("https://api.open-meteo.com/v1/forecast?latitude=31.23&longitude=121.47&current_weather=true")
data = resp.json()
print(data["current_weather"]["temperature"])

resp.json() 把接口返回的 JSON 文本解析成 Python 的字典 / 列表。解析方法与第 6 章的字典操作完全一样,这一点在下面「动手实践」中单独练习,不依赖网络。

虚拟环境venv 创建,把某个项目的依赖隔离在独立目录里,避免不同项目之间相互污染:

$ python3 -m venv .venv
$ source .venv/bin/activate      # Windows 用 .venv\Scripts\activate

激活后,pip install 安装的库只属于当前虚拟环境;用 deactivate 退出。项目开始时创建虚拟环境、把依赖写入 requirements.txt(pip freeze > requirements.txt)是常见做法。

动手实践

任务一:随机点名器。 读入逗号分隔的名单,随机输出一个名字,并随机打乱后依次输出。

python
import random

names = input("请输入名单,用逗号分隔: ").split(",")
print(f"被点到的人:{random.choice(names)}")

random.shuffle(names)
print("抽签顺序:", names)

任务二:JSON 解析(不联网)。 接口返回的结构通常像下面这个字典,练习用下标层层取出数据:

python
data = {
    "name": "Shanghai",
    "main": {"temp": 25.5},
    "weather": [{"description": "多云"}],
}

print(data["name"])
print(data["main"]["temp"])
print(data["weather"][0]["description"])

输出:

Shanghai
25.5
多云

观察:第一层是字典(data["name"]),temp 在嵌套字典里(data["main"]["temp"]),description 在列表的第一个元素的字典里(data["weather"][0]["description"])。8.3 节的 requests 示例,本质就是「先请求得到这样的结构,再用下标解析」。

常见错误

错误写法报错信息原因
未安装就 import requestsModuleNotFoundError: No module named 'requests'先用 pip install requests 安装
import math 后写 sqrt(16)NameError: name 'sqrt' is not definedimport math 引入后要写 math.sqrt
random.randint(1, 100) 返回随机数但两次运行不同不报错,结果是随机的需要固定结果时先 random.seed(n)
date(2026, 13, 2)ValueError: month must be in 1..12月份超出合法范围
网络不通时运行 requests.get(...)requests.exceptions.ConnectionError检查网络,或改用模拟数据练习

章末练习

基础

  1. math 计算:√100、ceil(9.1)、floor(9.9),输出结果。
  2. random.randint(1, 6) 模拟掷骰子,输出 10 次结果。
  3. datetime 创建日期 2026, 1, 1,输出它和它的年份、月份、日。

提高

  1. random.choice 写一个「剪刀石头布」:程序随机出一个,用户输入一个,输出谁赢了。
  2. 写程序:生成一个 6 位随机数字验证码(每一位是 0~9 的随机整数),输出。提示:循环 6 次拼接字符串。

挑战

  1. math 写函数 distance(x1, y1, x2, y2),返回两点间距离(√((x2-x1)²+(y2-y1)²)),验证 distance(0, 0, 3, 4) 等于 5.0。
  2. 解释下面的代码为什么结果与预期不同,并给出修正:
    python
    import random
    dice = random.randint(1, 6)
    print(dice)
    期望:模拟 10 次掷骰子,得到 10 个不同的结果。

章末自测

每题选择一个最佳答案。本书不附答案:完成后交由老师或 AI 老师批改讲解。

  1. import math 后,调用平方根的正确写法是?
    • A. sqrt(16)
    • B. math.sqrt(16)
    • C. import.sqrt(16)
    • D. math(16)
  2. from math import sqrt 之后,可以直接写?
    • A. math.sqrt(9)
    • B. sqrt(9)
    • C. math(9)
    • D. import(9)
  3. random.randint(1, 6) 可能返回?
    • A. 0
    • B. 6
    • C. 7
    • D. 6.0
  4. 安装第三方库的命令是?
    • A. pip install 库名
    • B. pip get 库名
    • C. install pip 库名
    • D. python 库名
  5. 没有安装 requestsimport requests 会?
    • A. 自动安装
    • B. 报 ModuleNotFoundError
    • C. 报 NameError
    • D. 正常运行
  6. math.ceil(3.2) 的结果是?
    • A. 3
    • B. 4
    • C. 3.2
    • D. 报错
  7. resp.json() 把 JSON 解析成?
    • A. 字符串
    • B. 字典或列表
    • C. 整数
    • D. 文件
  8. date(2026, 8, 2).year 的结果是?
    • A. 2026
    • B. 8
    • C. 2
    • D. "2026-08-02"
  9. 创建虚拟环境的命令是?
    • A. python3 -m venv .venv
    • B. pip venv
    • C. python3 venv
    • D. venv create
  10. 下面哪个不属于 Python 标准库? A. math B. random C. datetime D. requests