Python快速学习——第11章:模块

第十一章:模块

11.1 什么是模块?

模块就像 一个装满工具的箱子 ,每个模块都包含了一组相关的函数变量,可以帮助我们组织代码,实现代码的复用。Python中的模块实际上就是一个.py文件。

python 复制代码
# 使用内置math模块。
import math;
​
# 使用math模块中的函数。
print(math.sqrt(16));  # 4.0。
print(math.pi);        # 3.141592653589793。

11.2 为什么使用模块?

11.2.1 代码组织

模块帮助我们将代码分成逻辑单元:

markdown 复制代码
my_project/
├── main.py
├── utils/
│   ├── __init__.py
│   ├── file_utils.py
│   └── math_utils.py
└── models/
    ├── __init__.py
    ├── user.py
    └── product.py

11.2.2 代码复用

避免重复编写相同的代码:

python 复制代码
# 在不同项目中重用工具函数
from utils.math_utils import calculate_average
​
scores = [85, 92, 78, 90, 88]
average = calculate_average(scores)
print(f"平均分:{average}")

11.2.3 命名空间管理

避免命名冲突:

python 复制代码
import math
import statistics
​
# 不同模块可以有相同名称的函数
math.mean([1, 2, 3])        # math模块的mean函数
statistics.mean([1, 2, 3])  # statistics模块的mean函数

11.3 导入模块的方式

11.3.1 基本导入

python 复制代码
# 导入整个模块。
import math;
print(math.sqrt(25));
​
# 导入模块并指定别名。
import math as m;
print(m.sqrt(25));
​
# 导入特定函数/类。
from math import sqrt, pi;
print(sqrt(25));
print(pi);
​
# 导入所有内容(不推荐,可能导致命名冲突)。
from math import *;
print(sqrt(25));

运行结果:

复制代码
5.0
5.0
5.0
3.141592653589793
5.0

11.3.2 相对导入(在包内部)

在包内部的模块中使用相对导入:

python 复制代码
# 在 utils/math_utils.py 中
from . import file_utils  # 导入同级的file_utils模块
from ..models import user  # 导入上级models包中的user模块

11.4 Python标准库常用模块

11.4.1 math - 数学运算

python 复制代码
import math
​
# 基本数学函数
print(math.ceil(4.2))    # 5 - 向上取整
print(math.floor(4.8))   # 4 - 向下取整
print(math.fabs(-5))     # 5.0 - 绝对值
print(math.factorial(5)) # 120 - 阶乘
​
# 幂和对数
print(math.pow(2, 3))    # 8.0 - 幂运算
print(math.sqrt(16))     # 4.0 - 平方根
print(math.log(100, 10)) # 2.0 - 对数
​
# 三角函数
print(math.sin(math.pi/2))  # 1.0
print(math.cos(math.pi))    # -1.0
​
# 常数
print(math.pi)    # 3.141592653589793
print(math.e)     # 2.718281828459045

11.4.2 random - 随机数

python 复制代码
import random
​
# 生成随机数
print(random.random())          # 0.0到1.0之间的随机浮点数
print(random.uniform(1, 10))    # 1到10之间的随机浮点数
print(random.randint(1, 6))     # 1到6之间的随机整数(包括6)
​
# 序列操作
fruits = ["苹果", "香蕉", "橙子", "葡萄"]
print(random.choice(fruits))    # 随机选择一个元素
print(random.sample(fruits, 2)) # 随机选择2个不重复的元素
random.shuffle(fruits)          # 打乱序列顺序
print(fruits)

11.4.3 datetime - 日期时间

python 复制代码
import datetime
​
# 获取当前时间
now = datetime.datetime.now()
print(f"当前时间:{now}")
print(f"年份:{now.year}")
print(f"月份:{now.month}")
print(f"日期:{now.day}")
​
# 创建特定日期
birthday = datetime.datetime(1990, 5, 15)
print(f"生日:{birthday}")
​
# 时间计算
tomorrow = now + datetime.timedelta(days=1)
print(f"明天:{tomorrow}")
​
# 日期格式化
formatted = now.strftime("%Y-%m-%d %H:%M:%S")
print(f"格式化时间:{formatted}")
​
# 字符串转日期
date_str = "2023-12-25"
christmas = datetime.datetime.strptime(date_str, "%Y-%m-%d")
print(f"圣诞节:{christmas}")

11.4.4 os - 操作系统接口

python 复制代码
import os
​
# 文件和目录操作
print(os.getcwd())  # 获取当前工作目录
​
# 创建目录
os.makedirs("my_folder/sub_folder", exist_ok=True)
​
# 列出目录内容
print(os.listdir("."))  # 当前目录内容
​
# 检查路径是否存在
print(os.path.exists("my_folder"))  # True
​
# 路径操作
file_path = os.path.join("my_folder", "sub_folder", "file.txt")
print(f"文件路径:{file_path}")
​
# 环境变量
print(os.environ.get("PATH", "未找到PATH环境变量"))

11.4.5 sys - 系统相关参数

python 复制代码
import sys
​
# 命令行参数
print(f"脚本名称:{sys.argv[0]}")
print(f"参数列表:{sys.argv[1:]}")
​
# Python解释器信息
print(f"Python版本:{sys.version}")
print(f"平台:{sys.platform}")
​
# 退出程序
if len(sys.argv) < 2:
    print("需要提供参数")
    sys.exit(1)  # 非零退出码表示错误
​
# 模块搜索路径
print("模块搜索路径:")
for path in sys.path:
    print(f"  {path}")

11.4.6 json - JSON数据处理

python 复制代码
import json
​
# Python对象转JSON字符串
data = {
    "name": "张三",
    "age": 25,
    "courses": ["数学", "英语", "编程"],
    "is_student": True
}
​
json_str = json.dumps(data, ensure_ascii=False, indent=2)
print("JSON字符串:")
print(json_str)
​
# JSON字符串转Python对象
parsed_data = json.loads(json_str)
print(f"姓名:{parsed_data['name']}")
​
# 读写JSON文件
with open("data.json", "w", encoding="utf-8") as f:
    json.dump(data, f, ensure_ascii=False, indent=2)
​
with open("data.json", "r", encoding="utf-8") as f:
    loaded_data = json.load(f)
    print(f"从文件加载:{loaded_data['name']}")

11.5 创建自己的模块

11.5.1 创建简单模块

创建一个名为 my_math.py 的文件:

python 复制代码
# my_math.py
"""一个简单的数学工具模块"""
​
def add(a, b):
    """计算两个数的和"""
    return a + b
​
def multiply(a, b):
    """计算两个数的积"""
    return a * b
​
def factorial(n):
    """计算阶乘"""
    if n == 0:
        return 1
    result = 1
    for i in range(1, n + 1):
        result *= i
    return result
​
# 模块级别的常量
PI = 3.14159
VERSION = "1.0.0"

在其他文件中使用这个模块:

python 复制代码
# main.py
import my_math
​
print(my_math.add(5, 3))        # 8
print(my_math.multiply(4, 6))   # 24
print(my_math.factorial(5))     # 120
print(my_math.PI)               # 3.14159

11.5.2 创建包

包是包含多个模块的目录,需要包含 __init__.py 文件:

markdown 复制代码
my_package/
├── __init__.py
├── math_utils.py
└── string_utils.py

__init__.py 文件可以是空文件,也可以包含初始化代码:

python 复制代码
# my_package/__init__.py
"""我的工具包"""
​
from .math_utils import add, multiply
from .string_utils import reverse_string
​
__version__ = "1.0.0"
__all__ = ['add', 'multiply', 'reverse_string']

11.6 模块的搜索路径

Python按照以下顺序搜索模块:

  1. 当前目录
  2. 环境变量PYTHONPATH指定的目录
  3. Python标准库目录
  4. 第三方库目录(site-packages)
python 复制代码
import sys
​
# 查看模块搜索路径
for path in sys.path:
    print(path)
​
# 添加自定义路径
sys.path.append("/path/to/my/modules")

本章笔记:

  • 模块是组织Python代码的基本单位,通常是一个.py文件。
  • 使用模块可以提高代码的可维护性、可重用性和可读性。
  • Python有多种导入模块的方式:import、from...import、别名导入等。
  • Python标准库提供了丰富的模块,如math、random、datetime、os等。
  • 可以创建自己的模块和包来组织代码。
  • 模块搜索路径决定了Python如何找到要导入的模块。
相关推荐
长和信泰光伏储能14 分钟前
京津冀光伏发电:绿色能源的未来之路
python·能源
浦信仿真大讲堂39 分钟前
从重复操作到自动化闭环:如何让 CST 与 Python 真正协同起来
python·自动化·cst·仿真软件·达索软件
Gu Gu Study1 小时前
ScoutLoop开放域深度研究引擎(agent的初步设计想法)
人工智能·python
卷无止境2 小时前
写代码这件事,到底该讲究点什么?
后端·python
卷无止境2 小时前
循环复杂度到底在算什么,Python 代码怎么才能写得让人一看就懂
后端·python
lpfasd1232 小时前
MediaCrawler 项目深度分析
chrome·python·chrome devtools
Dxy12393102163 小时前
Python项目打包成EXE完整教程(PyInstaller实战避坑)
开发语言·python
bamb003 小时前
一个项目带你入门AI应用开发01
python
0566463 小时前
Python康复训练——常用标准库
开发语言·python·学习
昆曲之源_娄江河畔3 小时前
Python如何安装flask, pymssql
开发语言·python·flask·pymssql