一、模块化程序设计理念
模块和包概念的进化史
1.python的程序由模块组成,一个模块对应python源文件,一般后缀名:.py
2.模块由语句组成,运行python程序时,按照模块中语句的顺序依次执行。
3.语句是python程序的构造单元,用于创建对象、变量赋值、调用函数、控制语句等。
标准库模块、模块应用的优势
与函数类似,模块也分为标准库模块和用户自定义模块。
python标准库模块涵盖很广泛,例如:random(随机数)、math(数学运算)、time(时间)、file(文件处理)、os( *** 作系统交互)、sys(解释器交互。
另外,python还提供了海量的第三方模块,使用方式和标准库类似。
模块化编程有如下几大优势:
1、便于将一个任务分解成多个模块,实现团队协同开发,完成大规模程序。
2、实现代码复用。一个模块实现后,可以被反复调用。
3、可维护性强。
模块化编程的流程
一般流程:
1、设计API,进行功能描述。
2、编码实现API中描述的功能。
3、在模块中写测试代码,并消除全局代码。
4、使用私有函数实现不被外部客户端调用的函数模块。
我们可以用help(模块名)查看模块的API。
示例:导入math模块,并通过help()查看math模块的API
import math help(math)
示例2:设计计算薪水模块的API
"""本模块用于计算公司员工的薪资""" company="一个大学" def yearSalary(monthSalary): """根据传入的月薪,计算年薪""" pass def daySalary(monthSalary): """根据传入的月薪,计算出每天的薪资""" pass
只有功能描述和规范,需要编码人员按照要求实现编码。
可以通过__doc__获得模块的文档字符串内容。
import salary print(salary.__doc__)
运行结果:
模块的创建和代码测试
每个模块都有一个名称,可以通过特殊变量__name__获得模块的名称。正常情况下,模块名为源文件名,但是当模块被用作为程序入口时,它的__name__的值为__main__。我们可以根据这个特性将模块源代码文件中的测试代码进行独立处理。例:
import math math.__name__ #输出“math”
示例:通过__name__==“main”独立处理模块的测试代码
""本模块用于计算公司员工的薪资""" company="一个大学" def yearSalary(monthSalary): """根据传入的月薪,计算年薪""" return monthSalary * 12 def daySalary(monthSalary): """根据传入的月薪,计算出每天的薪资""" return monthSalary / 22.5 if __name__ == "__main__": #测试代码 print(yearSalary(3000)) print(daySalary(4000))
运行结果:
二、模块的导入
import 语句导入
import 语句的基本语法格式如下: import 模块名 导入一个模块 import 模块1,模块2..... #导入多个模块 import 模块名 as 模块名 #导入模块并使用新的名字
from…import 导入
基本语法格式: from 模块名 import 成员1,成员2 如果希望导入一个模块中所有成员,则可采用如下方式: from 模块名 import *
模块导入,本质上也就是生成多个module类对象而已,一个模块无论导入多少次,这个模块在整个解释器进程内有且仅有一个实例对象。
*** 作实例:
import math id(math) Out[3]: 2071684144088 type(math) Out[5]: module #导入多个模块,math的id不变 import math,turtle id(math) Out[7]: 2071684144088 #更改模块名,math模块id不变 import math as m id(m) Out[9]: 2071684144088 m=math id(m) Out[11]: 2071684144088 #调用函数 math.sin(3.14) Out[12]: 0.0015926529164868282 #from... math 导入 from math import pi,sin sin(3.14) Out[14]: 0.0015926529164868282
import()动态导入
给__import__()动态传递不同的参数值,就可以导入不同的模块
示例:
s="math" m=__import__(s) m.sin(3.14) Out[17]: 0.0015926529164868282
注意:一般不建议我们自行使用__import__()导入,在python2和python3中可能会出现意外错误。如果有需要可以使用importlib模块。
示例:
import importlib a=importlib.import_module("math") a.pi Out[20]: 3.141592653589793
三、包(package)的使用
包(package)的概念和结构
当一个项目有很多模块时,需要再进行组织。我们将功能类似的模块放到一起,就形成了“包”。
包(package)必须有一个__init__.py文件夹。典型的结构如:
包(package)下面可以包含“模块(module)”,也可以包含“子包(subpackage)"。就像文件夹下面有文件也可以有文件夹。
导入包 *** 作和本质
如果我们需要导入在aa子包里面的module_AA.py.方式如下:
1.import a.aa.module_AA 在使用时,必须加完整名称来引用,比如:a.aa.module_AA.fun_AA() 2.from a.aa.import module_AA 在使用时可以直接使用模块名。 a.aa.module_AA.fun_AA() 3.from a.aa. module_AA import fun_AA 直接导入函数 在使用时可直接使用函数名。 比如:fun_AA()
注意:1.from package import item 这种语法中,item可以时包、模块、也可以时函数、类、变量。
2.import item1.item2 这种语法中,item必须时包或者模块,不能是其他。
包中__init__.py的三个核心作用
1.作为包的标识,不能删除。
2.用来实现模糊导入。
3.导入包实质是执行__init__.py文件,可以在__init__.py文件中做这个包的初始化,以及需要统一执行代码、批量导入。
测试:
#a包中__init__.py文件中的内容 import turtle import math print("导入a包")
#b包中module_b1.py文件中导入a包 import a print(a.math.pi)
运行结果:
包内引用
如果是子包内的引用,可以按相对位置引入子模块,以aa包下的module_AA.py中导入a包下内容为例。
from..import module_A #..表示上级目录 .表示同级目录 from.import module_A2
sys.path和模块搜索路径
当我们导入某个模块时,需要找到这个文件,python解释器一般按照如下路径寻找模块文件(按照顺序找,找到即停下,找不到继续往下找)。
- 内置模块
- 当前目录
- 程序的主目录
- pythonpath 目录(如果已经设置了 pythonpath 环境变量)
- 标准链接库目录
- 第三方库目录(site-packages 目录)
- .pth 文件的内容(如果存在的话)
- sys.path.append()临时添加的目录
*** 作:
使用sys.path查看和临时修改搜索路径
在b目录下建立测试模块
import sys sys.path.append("d:/") print(sys.path)
运行结果:
模块内容部分总结如上,学习python的第11天,加油!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)