导入函数和包#

很多时候,我们需要默认Python库没有直接提供的工具。在这种情况下,我们需要从模块或包中导入必要的函数到我们的笔记本或脚本中。一些模块直接随Python发行版提供(比如在Python中的基础数学中看到的math模块),而一些其他的如Numpy、scikit-image等是通过pip或conda安装的外部包。在导入方面,它们的工作方式相同,我们有多种方法来导入单个函数或一组函数。

基本导入#

基本的导入语句使用关键词import和模块名。例如,使用处理文件路径和名称的基本Python模块pathlib

import pathlib

如果我们想导入一个外部包,我们需要确保它实际上已安装,否则我们会得到一个错误消息:

import absent_package
---------------------------------------------------------------------------
ModuleNotFoundError                       Traceback (most recent call last)
Input In [14], in <cell line: 1>()
----> 1 import absent_package

ModuleNotFoundError: No module named 'absent_package'

如果你缺少一个包,你可以直接从笔记本使用pip或conda安装它。例如,如果Numpy还没有安装,你可以执行:

conda install -c conda-forge numpy
Collecting package metadata (current_repodata.json): done
Solving environment: done

# All requested packages already installed.


Note: you may need to restart the kernel to use updated packages.

替代导入形式#

使用上面的简单形式,我们可以直接访问附加到主包的函数。让我们导入我们稍后将用于处理图像的Numpy包。我们可以导入它:

import numpy

现在我们可以通过简单使用点表示法来访问Numpy的余弦函数:

numpy.cos(3.14)
-0.9999987317275395

要找到包或模块中所有可用的函数,你通常需要查看其文档并寻找应用程序编程接口API。例如,这里我们可以找到Numpy所有数学函数(包括余弦)的描述:https://numpy.org/doc/stable/reference/routines.math.html

名称缩短#

如果我们经常使用一个包,我们可能不想每次需要使用它的函数时都写全包名。为了避免这种情况,我们可以在导入时使用as语句来缩写它:

import numpy as np
np.cos(3.14)
-0.9999987317275395

特定函数#

如果我们只需要包中的一个特定函数,我们也可以使用from语句只导入它。例如,如果我们只想导入上面的np.cos函数:

from numpy import cos
cos(3.14)
-0.9999987317275395

当然,在这种情况下,除非我们找到导入函数的具体行,否则我们不知道cos一定属于Numpy,因为我们也可能在笔记本中定义了这样一个函数。

子模块#

在像Numpy这样的大型包中,一些函数可以直接从主包访问(如np.cos),而其他更专门的任务则按主题或领域分组到子模块中。例如,Numpy有一个专门用于分布的子模块,叫做random。上面看到的所有要点在这里仍然适用。

我们使用点表示法来访问函数,但现在需要指定子模块名。例如,normal函数生成从正态分布中抽取的数字:

np.random.normal()
1.8077301364791438

我们可以通过只导入子模块来缩短函数调用:

from numpy import random
random.normal()
0.0909924357071552

我们可以进一步缩短,只导入函数:

from numpy.random import normal
normal()
0.0038794083334154307

练习#

Numpy包有一个名为linalg的线性代数子模块。以下代码计算向量的范数:np.linalg.norm([1,2])。尝试:

  • 只导入子模块并调用相同的函数

  • 只导入norm函数并调用它