Python 模块和包
模块是包含 Python 代码的文件,包是组织模块的目录。
模块基础
什么是模块?
模块是一个 Python 文件(.py),包含函数、类、变量等。
创建模块
创建文件 mymodule.py:
# mymodule.py
def greet(name):
return f"你好,{name}!"
def add(a, b):
return a + b
class Calculator:
def __init__(self):
self.result = 0
def add(self, num):
self.result += num
return self.result
def subtract(self, num):
self.result -= num
return self.result
VERSION = "1.0"
导入模块
# 导入整个模块
import mymodule
print(mymodule.greet("张三")) # 你好,张三!
print(mymodule.add(3, 5)) # 8
calc = mymodule.Calculator()
calc.add(10)
print(calc.result) # 10
print(mymodule.VERSION) # 1.0
导入特定内容
# 导入特定的函数/类/变量
from mymodule import greet, add
print(greet("张三")) # 你好,张三!
print(add(3, 5)) # 8
# 使用别名
from mymodule import greet as say_hello, Calculator as Calc
导入所有内容(不推荐)
# 导入模块中的所有内容
from mymodule import *
print(greet("张三"))
print(add(3, 5))
模块搜索路径
Python 按以下顺序查找模块:
- 当前目录
- 环境变量 PYTHONPATH 中的目录
- Python 安装目录
import sys
print(sys.path)
标准库模块
Python 自带丰富的标准库:
# datetime - 日期时间
import datetime
now = datetime.datetime.now()
print(now) # 2024-01-01 12:00:00
# random - 随机数
import random
print(random.random()) # 0-1 之间的随机数
print(random.randint(1, 10)) # 1-10 之间的随机整数
print(random.choice(['a', 'b', 'c'])) # 随机选择
# json - JSON 处理
import json
data = {'name': '张三', 'age': 20}
json_str = json.dumps(data)
print(json_str) # {"name": "张三", "age": 20}
# re - 正则表达式
import re
text = "我的邮箱是 [email protected]"
match = re.search(r'\w+@\w+\.\w+', text)
print(match.group()) # [email protected]
# os - 操作系统接口
import os
print(os.getcwd()) # 当前工作目录
print(os.listdir('.')) # 列出当前目录文件
包
包是包含 __init__.py 文件的目录,用于组织模块。
创建包
mypackage/
├── __init__.py
├── module1.py
├── module2.py
└── subpackage/
├── __init__.py
└── module3.py
init.py 文件
# mypackage/__init__.py
# 可以在这里导入包中的模块
from .module1 import function1
from .module2 import function2
__all__ = ['function1', 'function2']
导入包
# 导入包
import mypackage
# 导入模块
from mypackage import module1
# 导入模块中的函数
from mypackage.module1 import function1
使用别名
import mypackage.module1 as m1
m1.function1()
相对导入和绝对导入
绝对导入
从包的根目录开始导入:
from mypackage.module1 import function1
from mypackage.subpackage.module3 import function3
相对导入
使用 . 表示当前包,.. 表示上级包:
# 在 mypackage/subpackage/module3.py 中
from ..module1 import function1
from .. import module2
模块的 name 属性
每个模块都有 __name__ 属性:
- 当模块直接运行时:
__name__="__main__" - 当模块被导入时:
__name__="模块名"
# mymodule.py
def main():
print("这是主函数")
def greet(name):
return f"你好,{name}!"
if __name__ == "__main__":
# 只有直接运行此文件时才会执行
print(greet("张三"))
main()
安装第三方模块
使用 pip
# 安装包
pip install requests
# 卸载包
pip uninstall requests
# 查看已安装的包
pip list
# 查看包信息
pip show requests
# 升级包
pip install --upgrade requests
使用虚拟环境
创建独立的 Python 环境:
# 创建虚拟环境
python -m venv myenv
# 激活虚拟环境(Windows)
myenv\Scripts\activate
# 激活虚拟环境(macOS/Linux)
source myenv/bin/activate
# 退出虚拟环境
deactivate
requirements.txt
requests>=2.28.0
numpy>=1.21.0
pandas>=1.3.0
安装:
pip install -r requirements.txt
常用第三方库
| 库名 | 用途 | 安装命令 |
|---|---|---|
| requests | HTTP 请求 | pip install requests |
| numpy | 数值计算 | pip install numpy |
| pandas | 数据分析 | pip install pandas |
| matplotlib | 数据可视化 | pip install matplotlib |
| flask | Web 框架 | pip install flask |
| django | Web 框架 | pip install django |
| sqlalchemy | ORM | pip install sqlalchemy |
| pytest | 单元测试 | pip install pytest |
小结
本章我们学习了:
- 模块的创建和导入
- 模块搜索路径
- 标准库模块的使用
- 包的创建和导入
- 相对导入和绝对导入
- 模块的
__name__属性 - pip 包管理器和虚拟环境
练习
- 创建一个计算器模块,包含加减乘除功能
- 创建一个工具包,包含日期处理、字符串处理等工具函数
- 使用 pip 安装并使用 requests 库
- 创建并使用虚拟环境