Python 模块与包

11.1 模块的概念

模块是包含 Python 代码的 .py 文件,用于组织和管理代码。

为什么使用模块

  • 代码复用:在多个程序中共享代码
  • 命名空间:避免名称冲突
  • 可维护性:将代码分解为可管理的部分

11.2 导入模块

import 语句

1
2
3
4
5
# 导入整个模块
import math

print(math.pi) # 3.141592653589793
print(math.sqrt(16)) # 4.0

from…import 语句

1
2
3
4
5
6
7
8
# 导入特定函数/变量
from math import pi, sqrt

print(pi) # 3.141592653589793
print(sqrt(16)) # 4.0

# 导入所有内容(不推荐)
from math import *

as 别名

1
2
3
4
5
6
import numpy as np
import pandas as pd
from datetime import datetime as dt

now = dt.now()
print(now)

11.3 标准库常用模块

os 模块 - 操作系统接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import os

# 当前工作目录
print(os.getcwd())

# 切换目录
os.chdir("/tmp")

# 创建目录
os.makedirs("test/nested", exist_ok=True)

# 列出目录内容
print(os.listdir("."))

# 删除文件
# os.remove("file.txt")

# 环境变量
print(os.environ.get("PATH"))

sys 模块 - 系统相关

1
2
3
4
5
6
7
8
9
10
11
12
13
import sys

# 命令行参数
print(sys.argv)

# Python 版本
print(sys.version)

# 模块搜索路径
print(sys.path)

# 退出程序
# sys.exit(0)

datetime 模块 - 日期时间

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from datetime import datetime, date, time, timedelta

# 当前时间
now = datetime.now()
print(now) # 2024-11-22 10:30:00.123456

# 格式化
print(now.strftime("%Y-%m-%d %H:%M:%S"))

# 解析字符串
dt = datetime.strptime("2024-11-22", "%Y-%m-%d")
print(dt)

# 日期计算
tomorrow = now + timedelta(days=1)
print(tomorrow)

# 时间差
diff = tomorrow - now
print(diff.days) # 1

random 模块 - 随机数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import random

# 随机整数
print(random.randint(1, 10)) # 1-10

# 随机浮点数
print(random.random()) # 0.0-1.0

# 随机选择
fruits = ["apple", "banana", "orange"]
print(random.choice(fruits))

# 打乱列表
random.shuffle(fruits)
print(fruits)

# 抽样
numbers = list(range(1, 11))
print(random.sample(numbers, 3)) # 随机 3 个

11.4 自定义模块

创建模块

创建 mymodule.py

1
2
3
4
5
6
7
8
9
10
11
12
13
# mymodule.py

def greet(name):
return f"Hello, {name}!"

def add(a, b):
return a + b

PI = 3.14159

class Calculator:
def multiply(self, a, b):
return a * b

使用模块

1
2
3
4
5
6
7
8
9
# main.py
import mymodule

print(mymodule.greet("Alice"))
print(mymodule.add(3, 5))
print(mymodule.PI)

calc = mymodule.Calculator()
print(calc.multiply(4, 5))

11.5 包(Package)

包是包含多个模块的目录,通过 __init__.py 标识。

包结构

1
2
3
4
5
6
7
mypackage/
__init__.py
module1.py
module2.py
subpackage/
__init__.py
module3.py

init.py 的作用

1
2
3
4
5
6
7
8
9
10
# __init__.py

# 包初始化代码
print("Package initialized")

# 控制导入
from .module1 import func1
from .module2 import func2

__all__ = ["func1", "func2"] # from package import * 时导入的内容

导入包

1
2
3
4
5
6
7
8
# 导入模块
from mypackage import module1

# 直接导入函数
from mypackage.module1 import func1

# 使用 __init__.py 简化
from mypackage import func1, func2

11.6 第三方包管理

pip 命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 安装包
pip install requests

# 安装指定版本
pip install requests==2.28.0

# 升级包
pip install --upgrade requests

# 卸载包
pip uninstall requests

# 查看已安装包
pip list

# 导出依赖
pip freeze > requirements.txt

# 从文件安装
pip install -r requirements.txt

requirements.txt 示例

1
2
3
4
requests==2.31.0
flask==3.0.0
numpy>=1.24.0
pandas~=2.1.0

11.7 虚拟环境

虚拟环境用于隔离项目依赖。

创建虚拟环境

1
2
3
4
5
6
7
8
9
10
11
# 创建
python -m venv myenv

# 激活(Windows)
myenv\Scripts\activate

# 激活(macOS/Linux)
source myenv/bin/activate

# 退出
deactivate

使用虚拟环境

1
2
3
4
5
# 激活后安装包,仅影响当前环境
pip install requests

# 查看环境中的包
pip list

11.8 name 属性

1
2
3
4
5
6
7
# module.py

def main():
print("Module is running directly")

if __name__ == "__main__":
main()
  • 直接运行:__name__"__main__"
  • 被导入:__name__ 是模块名

11.9 本章小结

  • 模块是 .py 文件,包是包含 __init__.py 的目录
  • 导入方式:importfrom...importas 别名
  • 标准库:ossysdatetimerandom
  • 使用 pip 管理第三方包
  • 虚拟环境隔离项目依赖
  • __name__ == "__main__" 用于判断直接运行

练习题

  1. 创建一个模块 calculator.py,包含加减乘除函数
  2. 使用 datetime 模块计算两个日期之间的天数
  3. 使用 random 模块生成 6 位随机验证码
  4. 创建虚拟环境并安装 requests
ByteFisher
分享编程技术 · 记录钓鱼乐趣
扫码关注
▸ 扫码关注 ◂
Python基础教程 系列
第 11/20 篇
分享: