跳到主要内容

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 按以下顺序查找模块:

  1. 当前目录
  2. 环境变量 PYTHONPATH 中的目录
  3. 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

常用第三方库

库名用途安装命令
requestsHTTP 请求pip install requests
numpy数值计算pip install numpy
pandas数据分析pip install pandas
matplotlib数据可视化pip install matplotlib
flaskWeb 框架pip install flask
djangoWeb 框架pip install django
sqlalchemyORMpip install sqlalchemy
pytest单元测试pip install pytest

小结

本章我们学习了:

  1. 模块的创建和导入
  2. 模块搜索路径
  3. 标准库模块的使用
  4. 包的创建和导入
  5. 相对导入和绝对导入
  6. 模块的 __name__ 属性
  7. pip 包管理器和虚拟环境

练习

  1. 创建一个计算器模块,包含加减乘除功能
  2. 创建一个工具包,包含日期处理、字符串处理等工具函数
  3. 使用 pip 安装并使用 requests 库
  4. 创建并使用虚拟环境