Python 模块化编程全解析:模块、包与第三方库管理指南

模块与包

模块化编程是什么?用生活例子秒懂

想象你在搭乐高积木:

  • 每个小积木块都有特定功能(比如轮子、窗户、墙壁)—— 这就像模块(一个.py 文件,封装了函数或类)。
  • 把相关的积木块装进一个盒子里,方便分类和取用 —— 这就像(一个文件夹,里面装多个模块和子包,带__init__.py 标识)。

模块化编程的核心思想是:把复杂代码拆成小而独立的 "积木",需要时直接拿来用,不用重复造轮子

1.模块的概念

        模块就是一个.py为后缀的python文件,可以被其它Python程序导入和使用,也可以自己独立运行,里面存放着的是一组相关函数或者类。

1.1模块的导入

        模块的导入使用import关键字,配合from和as有以下几种用法:

导入方式 语法示例 适用场景
导入整个模块 import math 需要用模块里的多个功能,用模块名.功能调用
导入模块并取别名 import numpy as np 模块名太长(如 numpy→np),简化代码
导入模块中的特定功能 from os import getcwd 只需要模块里的 1-2 个功能,避免代码冗余
导入特定功能并取别名 from datetime import datetime as dt 功能名太长或避免冲突
导入模块中所有功能 from random import *

        import会把整个文件都导入进来,而使用from后可以只导入某一个模块,节省空间

示例

# 1. 导入整个模块
import math
print(math.sqrt(16))  # 用模块名.功能调用 → 4.0

# 2. 别名简化
import pandas as pd  # 约定俗成的别名,大家都这么用
df = pd.DataFrame({"name": ["Alice"]})  # 用别名调用

# 3. 导入特定功能
from os import getcwd, chdir
print(getcwd())  # 直接用功能名 → 输出当前目录

# 4. 功能取别名
from datetime import datetime as dt
print(dt.now())  # 用别名调用 → 输出当前时间

# 5. 导入所有功能(谨慎使用)
from random import *
print(randint(1, 10))  # 直接用函数名 → 随机1-10的整数

1.2模块的作用

  • 令Python代码的编写不必从零开始,不要重复写‘造轮子’的过程。
  • 避免同意模块内的命令冲突
  • 方便代码的管理与维护,提高代码的可读性

1.3模块的分类:内置、第三方、自定义

1.3.1内置模块(系统模块)

        Python解释器自带的标准库模块,可以直接导入使用,比如 keyword、os等,这些模块可直接导入而不需要安装,在所有安装了Python 解释器的电脑上都可以运行且每个py文件都会自动导入builtins模块。

特点

  • 即用即导入:直接import即可使用。

  • 性能高效:通常使用 C 语言实现。

1.3.1.1常见模块
模块 功能 官方文档
math 数学运算 math --- 数学函数 — Python 3.12.10 文档
os 操作系统接口 os --- Miscellaneous operating system interfaces — Python 3.13.5 文档
os.path 路径相关 os.path --- Common pathname manipulations — Python 3.13.5 文档
datetime 日期和时间 datetime --- Basic date and time types — Python 3.13.5 文档
random 随机数生成 random --- Generate pseudo-random numbers — Python 3.13.5 文档
time 时间 time --- Time access and conversions — Python 3.13.5 文档
1.3.1.2方法示例 
  • random模块:
import random
random.randint(1, 6)  # random.randint(a,b) 生产 a~b的随机整数
random.randint(1, 6)
random.random()   # random.random  生成包含0 但不包含1 的浮点数
random.choice("ABCD")    # 从一个序列中,随机返回一个元素
random.choice("ABCD")
L = [1, 2, 3, 6, 9]
random.choice(L)
random.shuffle(L)   # random.shuffer(x)  # 把列表X 打乱
print(L)
  •  time模块
import time

time.time()  # 返回当前时间的时间戳
time.ctime()  #返回当前的UTC 时间的字符串
t1 = time.localtime()  # 返回当前的本地时间元组
time.sleep(3)  # 让程序睡眠 n 秒
time.strftime("%Y-%m-%d", t1)  # 格式化时间
time.strftime("%y-%m-%d", t1)
time.strftime('%Y-%m-%d %H:%M:%S', t1)
  •  os模块:
# 1. os.getcwd(): 获取当前工作目录
import os
current_directory = os.getcwd()
print("当前工作目录:", current_directory)

# 2. os.chdir(path): 改变当前工作目录
new_directory = "F:\\01.AI07.深度学习框架\\00.上课课件"
os.chdir(new_directory)
print("工作目录已更改为:", os.getcwd())

# 3. os.listdir(path='.'): 返回指定目录下的所有文件和目录列表
directory_path = "."
files_and_dirs = os.listdir(directory_path)
print("指定目录下的文件和目录列表:", files_and_dirs)

# 4. os.mkdir(path): 创建目录
new_directory = "new_folder"
os.mkdir(new_directory)
print(f"目录 '{new_directory}' 已创建")

# 5. os.rmdir(path): 删除目录
directory_to_remove = "new_folder"
os.rmdir(directory_to_remove)
print(f"目录 '{directory_to_remove}' 已删除")

# 6. os.remove(path): 删除文件
file_to_remove = "example.txt"
os.remove(file_to_remove)
print(f"文件 '{file_to_remove}' 已删除")

1.3.2第三方模块

        由其他开发者开发且需要通过包管理工具(pip)安装的模块,比如Numpy、Pandas等库,如果有代码需要放到别的电脑上运行,那么这个电脑也需要先安装用到的第三方库才可以正常运行。
1.3.2.1常见模块 
模块 功能 示例
numpy 数值计算 科学运算、矩阵操作
pandas 数据分析 数据清洗与处理
matplotlib 数据可视化 绘制图表
requests HTTP请求处理 爬取网页内容,调用API
flask Web应用框架 快速搭建Web服务
1.3.2.2使用示例 

安装更新与卸载

安装
pip install  numpy  pandas requests
更新
pip install numpy  pandas requests
卸载
pip uninstall  numpy  pandas requests

使用

  • numpy 模块
import numpy as np
array = np.array([1, 2, 3])
print(array.mean())  # 输出: 平均值 2.0
  • pandas 模块
import pandas as pd
df = pd.DataFrame({"Name": ["Alice", "Bob"], "Age": [25, 30]})
print(df)
  •  requests 模块:用requests爬取网页内容
import requests

# 发送请求获取网页内容
response = requests.get("https://api.github.com")  # 调用GitHub开放API

# 打印结果(JSON格式)
print(response.json())  # 输出:GitHub API的返回数据(字典形式)

1.3.3自定义模块

        用户根据需求自己编写的.py文件。

1.3.3.1创建模块

        创建一个myutils.py文件:

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

def greet(name):
    return f"Hello, {name}!"
1.3.3.2 使用模块

        创建一个main.py文件,并导入自定义模块:

# main.py
import myutils

print(myutils.add(3, 5))  # 输出: 8
print(myutils.greet("Alice"))  # 输出: Hello, Alice!
1.3.3.3 跨文件夹使用

        在main.py中:

'''
假设目录结构如下:
project/
    utils/
        __init__.py
        math_utils.py
    main.py
'''
from utils.math_utils import add

print(add(3, 5))  # 输出: 8

 

1.4模块内置变量

        可通过dir()查看模块的内置变量:
  • __name__:用于确定模块是被直接运行还是被导入到其他模块中。当一个模 块被直接运行时,__name__的值是”__main__”,否则为模块的名称。
  • __doc__:包含模块的说明性文档。
  • __file__:包含模块的文件路径。
  • __all__:定义一个模块中的哪些变量、函数或类可以通过from module import *导入时可以用。
  • __package__:包含模块所在的包的名称。
  • __dict__:包含模块的全局命名空间。

2.包的概念

        就是一个有层次的文件目录结构,用来更好的组织和管理模块。通俗的说就 是一个目录,里面存放python文件和新的包目录,并且每一个包目录都需要存在 一个__init__.py文件,__init__.py文件可以没有内容,但必须有这个文件。
  • 作用:用于组织模块的集合,形成层次化的结构,便于管理大型项目。

  • 结构:

    my_package/
        __init__.py
        module1.py
        module2.py
        subpackage/
            __init__.py
            module3.py
        注意:__init__.py文件在Python3.3版本后其实就不用在创建了,但是为了不同 版本下的代码兼容,建议还是创建,且PyCharm会自动创建。

2.1__init__.py文件的主要作用:

  • 标识包目录:告诉Python解释器该文件所在的目录应被视为一个包而不是一 个普通的目录。如果没有这个文件,可能会无法正常导入包内的模块。
  • 执行初始化代码:在该文件中也可以存在代码,在调用该包里的模块时,该文 件里的代码也会被运行。
  • 控制包的导入行为:通过__all__来控制哪些模块可以被导入,从而限制包的公 开接口,防止不需要的模块导入。
  • 提供包级别的命名空间:在该文件中定义的变量和函数可以在包的其他模块中 共享。
  • 批量导入模块:在该文件中可以批量导入系统模块或其他模块。

示例:

# __init__.py 文件示例

# 1. 批量导入系统模块
import os
import sys
import datetime

# 2. 定义包级别的变量
package_variable = "This is a package variable"

# 3. 控制包的导入行为
__all__ = ['module1', 'module2']

# 4. 执行初始化代码
print("Initializing mypackage")

# 注意:这个代码会在包被导入时执行

# 5. 导入包内的模块
from . import module1
from . import module2

2.2导入包和子包

  • 使用import关键字可以导入包和子包,以访问其中的模块和内容。

    # 同模块的导入规则
    import 包名 [as 包别名]
    import  包名.模块名 [as 模块新名]
    import  包名.子包名.模块名 [as 模块新名]
    
    from 包名 import 模块名 [as 模块新名]
    from 包名.子包名 import 模块名 [as 模块新名]
    from 包名.子包名.模块名 import 属性名 [as 属性新名]
    
    # 导入包内的所有子包和模块
    from 包名 import *
    from 包名.模块名 import *

 示例:

# 导入包中的模块
import matplotlib.pyplot as plt

# 导入子包中的模块
from sklearn.linear_model import LinearRegression

2.3第三方包的相关操作:

安装
pip install package-name==version
更新
pip install –upgrade package-name
卸载
pip uninstall package-name

2.4包的创建

        新建一个Python软件包,就是创建了一个包,里面自带__init__.py文 件,只需要将写好的模块或包放入进去或直接在里面创建模块或即可。

3.模块与包的区别

模块
一个Python文件 一个包含__init__.py的文件夹
提供基本功能单元 用于组织多个模块
文件名为.py 目录名

 

4. 解析顺序

        在使用 import module_name时,Python 会按照特定顺序搜索并加载模块。

4.1 模块解析顺序

查找优先级 查找位置 说明
1️⃣ 内置 C 扩展模块 sys.builtin_module_names math, sys, time, os
2️⃣ sys.modules 缓存 sys.modules 避免重复加载
3️⃣ 当前目录 os.getcwd() 同名文件或目录
4️⃣ PYTHONPATH 变量 sys.path 环境变量指定的路径
5️⃣ Python 标准库 /usr/lib/python3.x/Lib/ 标准 Python 库
6️⃣ site-packages(第三方库) site.getsitepackages() pip install 安装的模块
7️⃣ __pycache__/*.pyc __pycache__/ 预编译字节码

 

4.2 内置C扩展模块

        最高优先级,Python 直接加载,不查找文件

4.3 sys.modules

        如果模块已加载,则直接返回,避免重复导入

import sys
print(sys.modules.keys())  # 查看已加载的模块

4.4 当前目录

        如果 C 扩展模块中找不到,就查找当前目录下是否有 module_name.py 或 module_name 目录

import os
print(os.getcwd())  # 查看当前目录

4.5 PYTHONPATH

        如果当前目录没有该模块,则检查 $PYTHONPATH$ 环境变量中的目录

import sys
print(sys.path)  # 列出所有可能的搜索路径


sys.path.insert(0, "/custom/path/")  # 添加路径

4.6 标准库

如果前面路径都找不到,会查找标准库中的模块。

4.7 第三方模块

最后,进入 site-packages 目录查找安装的第三方模块。

import site
print(site.getsitepackages())

4.8 __pycache__/

        从__pycache__/目录中加载 .pyc 文件,而不是重新解析 .py 文件。

        你可以删除 __pycache__/ 让 Python 重新编译 .py。

5.总结:模块化编程的核心价值

        模块化编程让Python代码从"一团乱麻"变成"井然有序的积木":  

  • - 代码复用:写一次功能,到处调用,不用重复劳动。  
  • - 易于维护:模块独立,改一处不影响其他部分。  
  • - 团队协作:多人分工写不同模块,最后像拼积木一样组合。  

        记住:学好模块和包,是从"写脚本"到"开发项目"的关键一步。下次写代码时,试试把常用功能拆成模块——你会发现代码变得清爽又好维护!

你可能感兴趣的:(java,前端,数据库)