系列文章

Python 从入门到精通

第 8 / 36 篇

从环境安装和基础语法出发,逐步学习工程实践、自动化、数据处理与 Web 开发。

  1. 01
    Python 怎么装、怎么用
  2. 02
    变量、数字和字符串
  3. 03
    列表:把一组数据放在一起
  4. 04
    元组、集合和字典
  5. 05
    条件判断:让程序做选择
  6. 06
    循环:重复的事交给程序
  7. 07
    函数:把代码整理成可复用的块
  8. 08
    模块与包:拆分你的程序正在阅读
  9. 09
    输入、输出与字符串格式化
  10. 10
    文件读写:保存程序的数据
  11. 11
    异常处理:程序出错时怎么办
  12. 12
    基础阶段练习:命令行记账本
  13. 13
    类和对象:面向对象入门
  14. 14
    继承、组合与特殊方法
  15. 15
    迭代器与生成器
  16. 16
    列表推导式与生成器表达式
  17. 17
    装饰器:给函数增加能力
  18. 18
    上下文管理器与 with
  19. 19
    类型标注与 dataclass
  20. 20
    正则表达式:从文本中找规律
  21. 21
    日期、时间与时区
  22. 22
    日志与调试
  23. 23
    虚拟环境与依赖管理
  24. 24
    测试:让修改不再提心吊胆
  25. 25
    网络请求:用 Python 调用 API
  26. 26
    网页解析与合规采集
  27. 27
    操作 Excel、CSV 与批量文件
  28. 28
    SQLite:给程序加一个数据库
  29. 29
    数据分析入门:NumPy 与 Pandas
  30. 30
    画图:把数据变得直观
  31. 31
    Flask 入门:做一个小网站
  32. 32
    异步编程:同时处理多项任务
  33. 33
    线程、进程与并发选择
  34. 34
    性能分析与优化
  35. 35
    项目结构、配置与发布
  36. 36
    综合项目:从需求到上线

查看整个系列 →

上一篇学了函数,把代码打包成块。但一个程序会越来越大,几千行全塞一个文件里谁也受不了。这就要说到 Python 的组织方式:模块(module)和包(package)。顺带,这也是你第一次接触”别人写好的代码”——标准库和第三方库。

什么是模块

模块就是一个 .py 文件。你把相关函数放进一个文件,它就是模块,别的文件可以导入它。比如你写了个 math_utils.py

# math_utils.py
def add(a, b):
    return a + b

def multiply(a, b):
    return a * b

然后在另一个文件里导入使用:

# main.py
import math_utils

print(math_utils.add(2, 3))        # 5
print(math_utils.multiply(2, 3))   # 6

import math_utils 会把整个模块加载进来,用 模块名.函数名 调用。

导入的几种写法

# 写法 1:导入整个模块(推荐,最清晰)
import math
print(math.sqrt(16))   # 4.0

# 写法 2:只导入某个名字
from math import sqrt
print(sqrt(16))        # 直接用,不用加 math.

# 写法 3:起别名(模块名太长时)
import numpy as np
print(np.__name__)     # numpy

# 写法 4:一次导入多个
from math import sqrt, pi
print(pi)              # 3.141592653589793

注意 from math import *(导入全部)不推荐——会把一堆名字塞进当前命名空间,容易冲突,代码也不好查来源。

标准库:Python 自带的百宝箱

Python 安装时就带了一大堆模块,叫标准库,不用装直接用。常用的几个:

import math
print(math.floor(3.7))    # 3 向下取整
print(math.ceil(3.2))     # 4 向上取整

import random
print(random.randint(1, 6))   # 随机 1-6(掷骰子)
print(random.choice(["石头", "剪刀", "布"]))

import os
print(os.getcwd())        # 当前目录
print(os.listdir("."))    # 当前目录的文件列表

import datetime
today = datetime.date.today()
print(today)              # 2026-08-14

用之前先查文档(Python 官方文档),标准库覆盖了文件、网络、时间、加密、压缩等等,很多需求不用自己造轮子。

第三方库:pip 安装

标准库之外的库,用 pip 安装。打开终端(命令行):

pip install requests
pip install beautifulsoup4

装完就能 import:

import requests
resp = requests.get("https://www.nsn0704y.cn")
print(resp.status_code)   # 200

国内下载慢可以换镜像源(后面讲虚拟环境那篇会细说):

pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple

if __name__ == “__main__”:这是啥?

你会在很多 Python 文件末尾看到这行,它是干什么的?

# tool.py
def main():
    print("工具开始运行...")

if __name__ == "__main__":
    main()

原理:每个模块都有个内置变量 __name__。当文件直接运行时,它是 "__main__";当被import时,它是模块名("tool")。

所以这行的意思是:只有直接运行这个文件时才执行下面的代码,被导入时只提供函数、不自动跑。这样别人 import 你的模块不会触发一堆副作用。

包:模块的文件夹

模块多了,用文件夹归类,这个文件夹就是。文件夹里放一个 __init__.py(可以是空文件,标记”这是包”):

myproject/
├── main.py
└── utils/
    ├── __init__.py
    ├── file_ops.py
    └── text_ops.py
# main.py
from utils.file_ops import read_config
from utils.text_ops import clean_text

导入路径用点号:utils.file_ops 表示 utils 包里的 file_ops 模块。目录结构清晰,项目一大就这么组织。

新手坑

坑 1:文件名和标准库重名。你建了个 random.py,再 import random 导入的是你自己的文件,标准库被”遮蔽”了,各种诡异报错。文件名避开常见库名。

坑 2:循环导入。a.py import b,b.py 又 import a,两个文件互相依赖会报 ImportError: cannot import name。解决办法:把公共代码抽到第三个模块。

坑 3:import 写在函数里。能跑但不规范,模块导入应该集中在文件顶部,一眼能看到依赖。

小结

  • 模块 = .py 文件;包 = 带 __init__.py 的文件夹
  • 导入:import 模块from 模块 import 名字import 模块 as 别名
  • 标准库直接用(math/random/os/datetime…),第三方库先 pip install
  • if __name__ == "__main__": 控制”直接运行才执行”
  • 文件名别和标准库重名,避免循环导入

练习

  1. 用 random 模块写一个”随机点名器”:从名单里随机抽一个人
  2. 把你上一篇写的函数(摄氏转华氏)存成 temp_utils.py,再写个 main.py 导入并调用
  3. 思考:在 tool.pyprint(__name__),直接运行和 import 它,分别输出什么?为什么这样设计有用?