模块即程序,模块是更高级的封装
数据的封装:列表,元组,字符串,字典
语句的封装:函数
方法(函数)和属性(数据)的封装:类
保存的每一个.py结尾的文件都是一个独立的模块
在Python的安装目录下(为了让默认的IDLE找到此模块)创建hello.py结尾的文件,当保存此文件时,即独立的Python模块,则可在IDLE中导入模块,模块名为文件名
>>>import hello
>>>hi()
但此时调用该模块(文件)中的函数会提示不存在
命名空间
命名空间表示标识符的可见范围,一个标识符(小红)可在多个命名空间(班级)中定义,在不同命名空间的含义互不相干。
Python中每个模块维护一个独立的命名空间,所以加上模块名可调用其中函数
>>>hello.hi()
导入模块方法
1.import模块名
注意在调用函数时需要模块的命名空间,如上例所示
2.from模块名 import函数名
该导入方法直接将模块的命名空间覆盖进来,所以调用时不需要加上命名空间
from hello import hi,go
from hello import * #*表示所有命名空间
但该方法不推荐,会陷入名字混乱的局面(没有体现命名空间的优势)
3.import模块名 as 新名字
给导入的命名空间替换新的名字
import hello as tc
>>>tc.hi()
_ _name_ _='_ _main_ _'
为了让Python知道模块是作为程序运行还是导入到其他程序中,需要使用模块的
_ _name_ _属性
#p13.py
def c2f(cel):
......
def f2c(fah):
......
def test():
......
if _ _name_ _ == '_ _main_ _':
test() #测试上述函数,且确保只有单独运行此文件,才执行test
#p14.py
import p13 as tc
......#调用p13函数
>>>_ _name_ _
'_ _main_ _' #作为程序运行
>>>tc._ _name_ _ #作为模块导入
p13''
上例显示在作为程序运行时,_ _name_ _属性值与作为模块导入时属性值(为该模块名字)不同
模块的作用:封装组织Python的代码(根据不同功能),达到代码复用的目的
搜索路径
模块放置位置的讨论
Python模块导入需要一个路径搜索过程,即导入某模块,则Python在预定义好的搜索路径中寻找该模块文件,若存在,才导入成功,而此搜索路径即目录,可通过sys模块中的path变量显示出来
>>>import sys
>>>sys.path
列出的路径是Python在导入模块时会去搜索的,尽管这些模块都可以使用,但
site-packages目录是最佳的选择,因为其专门负责这些事情
把模块所在位置添加到搜索路径上
>>>sys.path.append("C:\\Python34\\test\\M1")#该路径为模块存放位置
包
大型系统有许多模块,单单用模块定义功能还不够,所以采用包把模块分门别类地存放在不同的文件夹,然后把文件夹位置告诉Python。包的实现比较简洁:
1)创建文件夹,用于存放模块,文件夹名字即包的名字
2)在文件夹中创建一个_ _init_ _.py的模块文件,内容可为空
3)把相关模块放入文件夹中
注意第二步,必须在包的目录下建立该模块文件,用来告诉Python将该目录当成包来处理
4)导入包的模块(包名.模块名):
import M1.p13 as tc
>>>tc.c2f(32)
Python安装时附带有标准库,标准库里有模块,可查询官方文档
PEP(Python增强建议书):用来规范与定义Python的各自加强及延伸功能的技术规格(开发社区共同遵循的依据)
每个PEP都有唯一的编号,代表不同的技术规格,如PEP3000用来定义Python3的相关技术规格
联想之前的计时器程序,可采用timeit来对代码进行计时
快速掌握一个模块的用法,利用IDLE,先导入模块:
>>>import timeit
调用_ _doc_ _属性,查看该模块的简介,可以用print把它带格式打印出来
>>>print(timeit._ _doc_ _)
使用dir()函数查询该模块定义的变量,函数和类
>>>dir(timeit)
通过_ _all_ _属性来过滤掉不需要的名字
>>>timeit._ _all_ _ #设置了_ _all_ _属性了
可直接获得可供调用的接口信息,但注意到不是所有模块都有_ _all_ _的属性
若一个模块设置了_ _all_ _属性,则使用from timeit * 导入命名空间,就只有_ _all_ _属性这个列表中的名字才会被导入,其他不受影响
若没有设置_ _all_ _属性,则使用from timeit * 导入命名空间就会把所有不以下划线开头的名字都导入到当前的命名空间
建议编写模块是将对外提供的接口函数和类都设置到_ _all_ _属性列表中
>>>import timeit
>>>timeit._ _file_ _ #指明源代码的位置