细心的读者肯定能够发现,在之前的章节中使用的所有测试代码都是写在同一个源代码文件里的。随着程序功能复杂性的增加,代码越来越多。假设一个程序有10万行代码,显然无法将所有的代码都写在一个源代码文件里。
为了使代码的逻辑更加清晰,更加便于维护,可以把不同功能的函数分组,分别存放在不同的源代码文件里。这样一来,每一个源代码文件中的代码量就很少,非常便于理解和维护。每一个源代码文件以后缀.py命名。在Python中,.py文件被称为模块。
使用模块的最大好处是能让程序逻辑更加清晰,便于维护,且可以反复互相被引用,减少总的代码量。使用模块还可以避免函数和变量的冲突,相同名的函数和变量可以分别在不同的模块中进行定义和使用。
定义模块
定义一个新的模块,在模块中构建一个新的打印函数,使输出打印信息时能够加上个人标签,模块名为module,源代码文件为module.py,即
import语句
要想使用构建的module模块,需要在另一个源代码文件中使用import语句将module模块导入,编写测试程序test.py的代码为
将module.py和test.py放置在同一个目录下,执行测试程序test.py的运行结果为
可以看到,module模块提供的打印函数自动在输出内容前添加了标签[Python-IoT]。
from import语句
在Python中,from import语句可以将模块中的指定函数导入命令空间,如在测试程序test.py中,使用from module import printInfo可以将printInfo函数导入,直接调用printInfo函数,不需要通过模块名来调用。
注意,本例中使用的是printInfo('test'),上一例中使用的是module.printInfo('test')。
如果模块中有多个函数,那么使用from import语句可以仅导入需要的函数,其他函数不需要导入。如果想要导入模块的所有内容,则使用from…import*。
在模块中,除了函数,还可以有其他可执行的代码。这些代码只有模块被第一次导入时才被执行。修改module.py为
修改test.py为
执行test.py的结果为
可以看到,模块module中的其他代码在模块被导入时执行,无论被导入多少次,仅执行一次。
模块解决了函数名和变量名的冲突问题,在一个项目中,若不同程序员编写的模块名相同,怎么办呢?为了避免模块名的冲突,Python引入了按目录来组织模块的机制,称其为包。
将module.py文件放置在目录module_new中,如果目录中包含名为__init__.py的文件,那么该目录就可以被称为一个Python包。mobule_new目录结构为
修改测试代码test.py为
执行test.py的结果为
与模块的导入方法类似,from…import和import*对于包同样适用,读者可自行编写测试程序进行体会。