模块是把程序代码和数据封装的Python文件,也就是说,每一个以扩展名py结尾的Python源代码文件都是一个模块。每一个模块文件就是一个独立的命名空间,用于封装顶层变量名;在一个模块文件的顶层定义的所有的变量名(函数名也是一个变量名),称作模块的属性。导入模块给予了对模块的全局作用域中的变量名的读取权,也就是说,在模块导入时,模块文件的全局作用域变成了模块内对象的命名空间。
导入一个模块之后,可以使用模块中定义的属性,例如,在模块moduleA中导入一个模块moduleB,那么moduleB就变成了命名空间,在moduleA中可以使用moduleB中的全局变量,引用的格式是:moduleB.attribution_name。
概括来说,Python中的模块拥有三个大的作用:
- 代码重用:模块用于保存代码,按照需要导入或重新导入模块,以使用模块中的代码。
- 变量封装:模块把变量名封装起来,模块变成了一个独立的命名空间,模块封装的变量名变成了属性,这就避免了变量名的冲突。
- 代码共享:把通用的代码组织成模块,分享给他人。
一,Python程序的结构
一般来说,一个Python程序结构是由一个主文件(又称为顶层文件、脚本)和多个模块构成的,其中主文件包含了程序的控制流程,也就是启动之后能够运行整个程序的文件,而模块文件是用于提供工具的库。
在Python中,一个文件导入了一个模块来获得该模块内定义的工具的访问权,因此,通用的Python程序的结构就是:在顶层文件中导入模块,并引用模块中的工具。
例如,在脚本文件main.py中导入functools模块中的reduce()函数,使用该工具函数实现列表元素的加和:
from functools import reduce a=reduce((lambda x,y:x+y),range(0,5)) print(a)
二,模块的创建
定义模块,只需要使用文本编辑器,把一些Python代码输入到文本文件中,然后以".py"为扩展名名进行保存,任何此类文件都会被自动认为是Python模块。在模块顶层指定的变量名是模块的属性。注意:模块的文件名必须以扩展名 .py 结尾。
例如,创建一个strtools模块,文件名必须是strtools.py,文件的内容是Python代码,其中append_suffix是模块的属性名,引用该属性的格式是:strtools.append_suffix(arg):
def append_suffix(str): return str+'- py'
三,导入模块
导入从本质上来讲,就是为了载入另一个文件,并能够读取该文件的内容。模块的导入是由两个语句来处理:
- import语句:以一个整体导入一个模块;
- from语句:从一个模块文件中导入特定的变量名;
import语句和from语句都会加载模块,加载的过程包括搜索、编译和执行模块文件。两者的差别在于:import语句 会读取整个模块,所以必须进行定义后才能读取它的属性;form语句直接获取模块中特定的变量名。
在一个导入语句中的模块名起到两个作用:识别加载的外部文件;把模块名作为命名空间,用于封装模块内的顶层变量名。在导入模块时,模块定义的对象也会在import语句执行时创建,通过module_name.attribution_name来引用模块内定义的变量名。
例如,在主文件中导入strtools模块,并使用append_suffix()函数:
import strtools mystr=strtools.append_suffix('It is a cat') print(mystr)
1,import语句
import语句使用一个变量名来引用整个模块对象,因此,必须通过模块名称来获得模块的属性:
import strtools strool.append_suffix('xx')
2,from语句
from语句把变量名复制到另一个作用域,因此,可以直接在脚本中使用变量名,而不需要通过模块:
from strtools import append_suffix append_suffix('xx')
由于模块中的变量名可能由很多,可以使用*,取得模块顶层的所有变量名,把模块顶层的变量名都复制到当前的作用域内:

