模块与包

PythonPythonBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

介绍

在本实验中,我们将探索如何使用 Python 模块(modules)和包(packages)来组织和重用代码。我们将从简单的示例开始,逐步构建更复杂的示例。通过本实验,你将深入了解如何在自己的项目中使用模块和包。

学习目标

  • Python 模块
  • Python 包
  • PyPI

Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL python(("Python")) -.-> python/ModulesandPackagesGroup(["Modules and Packages"]) python(("Python")) -.-> python/ErrorandExceptionHandlingGroup(["Error and Exception Handling"]) python(("Python")) -.-> python/NetworkingGroup(["Networking"]) python/ModulesandPackagesGroup -.-> python/importing_modules("Importing Modules") python/ModulesandPackagesGroup -.-> python/creating_modules("Creating Modules") python/ModulesandPackagesGroup -.-> python/using_packages("Using Packages") python/ModulesandPackagesGroup -.-> python/standard_libraries("Common Standard Libraries") python/ErrorandExceptionHandlingGroup -.-> python/catching_exceptions("Catching Exceptions") python/NetworkingGroup -.-> python/http_requests("HTTP Requests") subgraph Lab Skills python/importing_modules -.-> lab-89{{"模块与包"}} python/creating_modules -.-> lab-89{{"模块与包"}} python/using_packages -.-> lab-89{{"模块与包"}} python/standard_libraries -.-> lab-89{{"模块与包"}} python/catching_exceptions -.-> lab-89{{"模块与包"}} python/http_requests -.-> lab-89{{"模块与包"}} end

什么是 Python 模块和包?

模块(module) 是 Python 中的一个文件,其中包含函数、类和变量的定义。我们可以使用模块将大型程序分解为更小、更易管理的部分。模块还使得在多个项目中重用代码变得容易。

包(package) 是模块的集合。包允许我们将相关的模块分组,并使用简单的点符号访问它们。

Python 模块和包可以分为以下几类:

  1. 内置模块(Built-in modules):这些模块随 Python 解释器一起提供,所有 Python 程序都可以使用。内置模块的示例包括 mathossysrandom
  2. 标准库模块(Standard library modules):这些模块是 Python 标准库的一部分,但并未内置到解释器中。它们可以像内置模块一样导入和使用。标准库模块的示例包括 jsonurllibrecsv
  3. 第三方模块(Third-party modules):这些模块由 Python 核心开发团队以外的个人或组织开发和维护。它们可以像内置模块和标准库模块一样导入和使用,但需要单独安装。有许多第三方模块可供使用,涵盖了广泛的主题和用途。一些示例包括 numpypandasrequestsbeautifulsoup4
  4. 本地模块(Local modules):这些模块位于使用它们的 Python 程序所在的同一目录中。我们可以使用 import 语句和模块名称导入本地模块,而无需指定完整路径。
  5. 相对导入(Relative imports):这些导入是相对于当前包或模块的。它们允许我们导入位于与当前目录不同的目录中的模块和包。我们可以使用相对导入来导入属于同一项目但组织在不同目录结构中的模块和包。

总之,Python 模块和包可以根据它们的来源和访问方式进行分类。内置模块和标准库模块随 Python 解释器一起提供,所有 Python 程序都可以使用,而第三方模块需要单独安装。本地模块和相对导入允许我们导入位于同一项目但位于不同目录结构中的模块和包。

以下是如何使用 Python 内置模块之一 math 模块的示例。

打开一个新的 Python 解释器会话并输入以下代码:

python3
import math

## 计算 16 的平方根
x = math.sqrt(16)
print(x)  ## 输出:4.0

## 计算 pi 的正弦值
y = math.sin(math.pi)
print(y)  ## 输出:1.2246467991473532e-16

## 计算 5 的阶乘
z = math.factorial(5)
print(z)  ## 输出:120

math 模块是 Python 的一个内置模块,提供了数学函数和常量。math 模块中可用的一些函数包括 sqrt()sin()cos()tan()log()exp()factorial()math 模块还提供了诸如 pie 之类的常量。

我们可以使用 import 语句导入 math 模块,然后在代码中调用其函数并访问其常量。

在上面的示例中,我们使用 sqrt() 函数计算 16 的平方根,使用 sin() 函数计算 pi 的正弦值,并使用 factorial() 函数计算 5 的阶乘。我们还使用 pi 常量表示 sin() 函数调用中的 pi 值。

还有许多其他内置的 Python 模块提供了有用的函数和常量。一些示例包括用于与操作系统交互的 os 模块、用于处理日期和时间的 datetime 模块,以及用于生成随机数的 random 模块。你可以在文档中找到所有内置 Python 模块的完整列表。

创建一个 Python 模块

在这一步中,我们将创建一个 Python 模块。模块是一个包含 Python 代码的文件。

以下是一个创建和使用 Python 模块的简单示例:

首先,在路径 /home/labex/project/ 下创建一个名为 my_module.py 的新文件。这将作为我们的模块文件。

my_module.py 文件中,定义一个名为 say_hello() 的函数,该函数会向控制台打印一条问候语:

def say_hello():
    print("Hello from my_module!")

保存文件。

现在,打开一个新的 Python 文件(或进入 Python 解释器),并使用 import 语句导入 my_module 模块:

import my_module

要使用 my_module 模块中的 say_hello() 函数,可以像这样调用它:

my_module.say_hello()  ## 输出:"Hello from my_module!"

就是这样!我们已经成功创建并使用了一个 Python 模块。

ImportError 异常

请注意,当我们导入一个模块时,Python 会在当前目录以及 PYTHONPATH 环境变量中列出的任何目录中查找模块文件。如果未找到模块文件,我们将收到一个 ImportError 异常。

让我们尝试导入一个不存在的模块。

打开一个新的终端窗口,并将当前目录更改为 /home/labex/

cd /home/labex/

现在,打开一个新的 Python 解释器并尝试导入 my_module 模块:

python3
import my_module

你应该会收到一个 ImportError 异常:

ModuleNotFoundError: No module named 'my_module'

你可以通过将以下代码添加到你的 Python 文件中,将目录添加到 PYTHONPATH 环境变量中:

import sys
## my_module.py 位于 /home/labex/project/ 目录中
sys.path.append("/home/labex/project")

import my_module
my_module.say_hello()

请注意,sys.path.append() 函数必须在 import 语句之前调用。

创建一个 Python 包

在这一步中,我们将创建一个 Python 包。包是一个包含 Python 模块的目录。

让我们升级上一步的示例。

首先,在路径 /home/labex/project/ 下创建一个名为 my_package 的新目录。这将作为我们的包目录。

/home/labex/project/my_package 目录中,创建一个名为 __init__.py 的新文件。这是一个特殊文件,用于告诉 Python 应将 my_package 目录视为一个包。

my_package 目录中,创建一个名为 my_module.py 的新文件。这将作为我们的模块文件。

my_module.py 文件中,定义一个名为 say_hello() 的函数,该函数会向控制台打印一条问候语:

def say_hello():
    print("Hello from my_module!")

现在,打开一个新的 Python 文件(或进入 Python 解释器),并导入 my_package 包:

import my_package

要使用 my_module 模块中的 say_hello() 函数,可以像这样调用它:

my_package.my_module.say_hello()  ## 输出:"Hello from my_module!"

就是这样!我们已经成功创建并使用了一个包含模块的 Python 包。

以下是项目的目录结构:

my_package/
├── __init__.py
└── my_module.py

此示例展示了如何创建一个包并使用点符号访问其模块。my_package 包包含 my_module 模块,我们可以通过调用 my_package.my_module.say_hello() 来访问 my_module 模块中的 say_hello() 函数。

在这种情况下,my_package 是一个 Python 包,而 my_module 是一个 Python 模块。包允许我们以层次结构组织代码,这对于包含许多模块的大型项目非常有帮助。

总之,包和模块之间的主要区别在于,包是一个可以通过点符号访问的模块集合,而模块是一个包含函数、类和变量定义的独立文件。

第三方包

Python 第三方包是由 Python 核心开发团队以外的个人或组织开发和维护的包。它们可以像内置模块和标准库模块一样导入和使用,但需要单独安装。

Python 有许多第三方包可供使用,涵盖了广泛的主题和用途。一些示例包括用于科学计算的 numpy、用于数据分析的 pandas、用于处理 HTTP 请求的 requests,以及用于网络爬虫的 beautifulsoup4

Python 如此受欢迎的最重要原因之一就是丰富的第三方包。

要安装第三方包,我们可以使用默认随 Python 一起提供的 pip 包管理器。例如,要安装 requests 包,可以运行以下命令:

pip install requests

我们还可以使用其他包管理器(如 conda)来安装第三方包。更多信息请参阅 Anaconda

安装包后,我们可以在 Python 代码中导入并使用它。例如,以下是如何使用 requests 包发送 HTTP 请求并打印响应的示例:

python3
import requests

response = requests.get("https://www.example.com")
print(response.text)

这段代码使用 requests 包向 URL https://www.example.com 发送 HTTP GET 请求,然后将响应文本打印到控制台。

requests.get() 函数向指定的 URL 发送 HTTP GET 请求,并返回一个包含响应数据的 HTTPResponse 对象。响应对象具有各种属性和方法,允许我们访问和操作响应数据。

在这种情况下,response.text 属性包含作为字符串的响应主体。通过调用 print(response.text),我们将响应主体打印到控制台。

Python 第三方包是 Python 生态系统的重要组成部分,因为它们为常见任务提供了现成的解决方案,并扩展了 Python 的功能。它们可以为我们节省时间和精力,提供可以在项目中使用的预构建解决方案,而不必从头开始构建所有内容。

除了使用第三方包节省时间和精力外,它们还可以帮助我们编写更可靠和可维护的代码。通过使用经过良好测试且广泛使用的包,我们可以利用他人的工作,专注于解决我们的具体问题。

总的来说,Python 第三方包是扩展 Python 功能和解决常见任务的重要资源。它们可以为我们节省时间和精力,帮助我们与其他工具和库集成,并提高代码的可靠性和可维护性。

总结

在本实验中,我们学习了如何使用 Python 模块和包来组织和重用代码。我们了解了如何在程序中导入和使用模块和包,还学习了如何创建自己的包。通过使用模块和包,我们可以编写更清晰、更易维护的代码。