2.8 模块:仓库

模块就像仓库一样,将实现不同功能的函数封装在内。因此,在调用模块内的函数时,需要导入模块,如2.7节中提到的floor函数,它被封装在math模块中。图2-16中给出了导入math模块,以及调用math模块中的floor函数向下取整、调用ceil函数向上取整、调用sqrt函数开平方的方法。

图2-16 导入math模块以及调用math模块中函数的方法

由此可见,Python可以使用import命令导入模块,然后以模块.函数(module.function)的模式调用模块中的函数。

至此,作者认为已经足够幸运在每一次的展示中都能成功获得结果,这或许与作者具有一定的编程基础有关。但若你完全没有编程基础,可能会出现不同的错误。因此,在这里作者认为引入一定的错误示例,对于初学者或是有一定编程基础的读者来说并非坏事。当没有导入模块就调用模块中的函数,或者导入了模块但调用时忘记书写模块前缀时,会发生如图2-17所示的错误。如果你在运行类似程序时发生这种错误,只要认真阅读本节前面部分内容,就能找到解决方法。

(a)math模块未导入

(b)未书写math模块前缀

图2-17 调用sqrt函数出错

另外一种调用模块中函数的方式是“from 模块(module) import 函数(function)”,这样导入模块后,调用该模块中的函数时直接使用函数的名称,无须指定模块前缀,示例如

>>> from math import sqrt
>>> sqrt(16)
4.0

对于两种导入方式,作者更推荐使用前者,这是因为不同的模块中存在同名函数,如果使用“from 模块(module) import 函数(function)”的方式导入模块,则无法调用其他模块中存在冲突的同名函数。以sqrt函数为例,sqrt函数的入参(输入参数)应为非负实数,当调用sqrt函数并且它的入参不为实数时,Python IDLE会报错。然而在诸多学科中需要引入复数,在复数域内进行开平方的运算。为此Python引入了cmath模块,其中的sqrt函数可以处理复数域内的开平方运算。图2-18展示了调用math模块中sqrt函数与cmath模块中sqrt函数对-1进行开平方的计算结果。

(a)调用math模块中的sqrt函数

(b)调用cmath模块中的sqrt函数

图2-18 分别调用math和cmath模块中的sqrt函数

调用cmath模块中的sqrt函数获得的结果为1j,其中j代表虚数单位。在本书中,不对复数以及虚数做过多介绍。由此可见,使用import导入模块的方式更适合复杂的程序,即实际工程或科学计算中具有一定规模的程序。