一文搞懂 Python 3 中的 import

简介

Python 编程语言自带各种内置函数。其中包括一些常见的函数,例如:

  • print() 用于打印表达式
  • abs() 用于返回一个数的绝对值
  • int() 用于将其他数据类型转换为整数
  • len() 用于返回序列或集合的长度

然而,这些内置函数是有限的,我们可以利用模块来创建更复杂的程序。

模块 是由 Python .py 文件组成的 Python 代码。任何 Python 文件都可以被引用为一个模块。一个名为 hello.py 的 Python 文件具有模块名称 hello,可以被导入到其他 Python 文件中,或者在 Python 命令行解释器中使用。您可以通过阅读《如何在 Python 3 中编写模块》来了解如何创建自己的模块。

模块可以定义函数、类和变量,您可以在其他 Python .py 文件中或通过 Python 命令行解释器中引用这些函数、类和变量。

在 Python 中,通过使用 import 语句来访问模块。当您这样做时,您执行模块的代码,保持定义的作用域,以便您当前的文件可以利用这些定义。

例如,当 Python 导入一个名为 hello 的模块时,解释器首先会搜索内置模块中是否存在名为 hello 的模块。如果没有找到内置模块,Python 解释器将在它从 sys.path 变量接收到的目录列表中搜索名为 hello.py 的文件。

本教程将引导您检查和安装模块,导入模块以及为模块设置别名。

先决条件

您应该已经安装了 Python 3,并在您的计算机或服务器上设置了编程环境。如果您还没有设置编程环境,可以参考适用于您操作系统(Ubuntu、CentOS、Debian 等)的本地编程环境或服务器编程环境的安装和设置指南。

检查和安装模块

Python 标准库中内置了许多模块,这些模块提供了对系统功能的访问或提供了标准化的解决方案。Python 标准库是每个 Python 安装的一部分。

要检查这些 Python 模块是否已准备就绪,请进入您的本地 Python 3 编程环境或基于服务器的编程环境,并在命令行中启动 Python 解释器,如下所示:

python

在解释器中,您可以运行 import 语句,以确保给定的模块已准备好调用,例如:

>>)">import math

由于 math 是一个内置模块,您的解释器应该会在不返回任何反馈的情况下完成任务,并返回到提示符。这意味着您无需执行任何操作即可开始使用 math 模块。

让我们使用一个您可能尚未安装的模块,如 2D 绘图库 matplotlib,来运行 import 语句:

>>)">import matplotlib

如果未安装 matplotlib,您将收到以下错误:

ImportError: No module named 'matplotlib'

您可以使用 CTRL + D 来退出 Python 解释器,然后使用 pip 安装 matplotlib

接下来,我们可以使用 pip 来安装 matplotlib 模块:

pip install matplotlib

安装完成后,您可以在 Python 解释器中使用 import matplotlib 导入 matplotlib,并且不会出现错误。

导入模块

要使用模块中的函数,您需要使用 import 语句导入模块。

import 语句由 import 关键字和模块的名称组成。

在 Python 文件中,这将在代码顶部声明,在任何 shebang 行或一般注释之下。

因此,在 Python 程序文件 my_rand_int.py 中,我们将以以下方式导入 random 模块以生成随机数:

import random

当我们导入一个模块时,我们将其作为一个独立的命名空间在当前程序中使用。这意味着我们必须使用点符号引用函数,例如 [module].[function]

在实践中,以 random 模块为例,这可能看起来像是调用 random.randint() 函数返回一个随机整数,或者调用 random.randrange() 函数返回指定范围内的随机元素。

让我们创建一个 for 循环,以展示如何在我们的 my_rand_int.py 程序中调用 random 模块的函数:

import random


for i in range(10):
    print(random.randint(1, 25))

这个小程序首先在第一行导入 random 模块,然后进入一个将处理 10 个元素的 for 循环。在循环内,程序将打印出 1 到 25(包括 25)范围内的随机整数。整数 125 被传递给 random.randint() 作为其参数。

当我们运行 python my_rand_int.py 程序时,我们将收到 10 个随机整数作为输出。由于这些是随机的,每次运行程序时可能会得到不同的整数,但它们将生成类似于以下内容:

6
9
1
14
3
22
10
1
15
9

这些整数不应该小于 1 或大于 25。

如果您想要使用多个模块的函数,可以通过添加多个 import 语句来实现:

import random
import math

您可能会看到导入多个模块的程序,使用逗号分隔它们,例如 import random, math,但这与 PEP 8 风格指南不一致。

为了使用我们的额外模块,我们可以将 math 模块中的常数 pi 添加到我们的程序中,并减少打印出的随机整数数量:

import random
import math


for i in range(5):
    print(random.randint(1, 25))

print(math.pi)

现在,当我们运行程序时,我们将收到类似于以下内容的输出,其中我们的最后一行输出是 pi 的近似值:

18
10
7
13
10
3.141592653589793

import 语句允许您将一个或多个模块导入到您的 Python 程序中,让您可以使用这些模块中构建的定义。

使用 fromimport

要在程序的命名空间中引用模块中的项目,您可以使用 fromimport 语句。以这种方式导入模块时,您可以通过名称引用函数,而不是通过点符号引用。

在这种构造中,您可以指定要直接引用的定义。

在其他程序中,您可能会看到 import 语句使用通配符 (*) 来引用模块中定义的所有内容,但这在 PEP 8 中是不被鼓励的。

让我们首先回顾一下从 random 模块中导入一个特定函数 randint()

from random import randint

在这里,我们首先调用 from 关键字,然后是模块的名称 random。接下来,我们使用 import 关键字,并调用我们想要使用的特定函数。

现在,当我们在程序中实现这个函数时,我们将不再使用 random.randint() 的点符号,而只会写 randint()

from random import randint


for i in range(10):
    print(randint(1, 25))

当您运行程序时,您将收到与之前类似的输出。

使用 fromimport 构造允许我们在程序的命名空间中引用模块的定义,从而避免使用点符号。

为模块设置别名

通过使用 as 关键字,可以在 Python 中修改模块及其函数的名称。

您可能想要更改名称,因为您在程序中已经使用了相同的名称,您导入的另一个模块也使用了该名称,或者您可能想要缩写您经常使用的较长名称。

这个语句的构造如下:

import [module] as [another_name]

让我们在我们的 my_math.py 程序文件中修改 math 模块的名称。我们将模块名称从 math 修改为 m,以缩写它。我们修改后的程序将如下所示:

import math as m


print(m.pi)
print(m.e)

在程序中,我们现在将 pi 常数称为 m.pi 而不是 math.pi

对于一些模块,使用别名是很常见的。matplotlib.pyplot 模块的官方文档要求使用 plt 作为别名:

import matplotlib.pyplot as plt

这允许程序员将较短的单词 plt 附加到模块中的任何函数,例如 plt.show()。您可以在我们的“如何使用 matplotlib 在 Python 3 中绘制数据”教程中看到这个别名导入语句的使用。

结论

当我们导入模块时,我们能够调用不是内置于 Python 中的函数。一些模块作为 Python 的一部分安装,而一些模块我们将通过 pip 安装。

利用模块使我们的程序更加健壮和强大,因为我们正在利用现有的代码。我们还可以为自己创建模块,供将来的程序员在未来的程序中使用。