面向过程编程和模块
面向过程编程和模块
1.面向过程编程
1.1定义
类似于一条产品流水线 但过程中有一个功能需要变动修改 那么整体都需要变动修改
2.模块
2.1模块的介绍
2.1.1定义
一系列功能的结合体
2.1.2作用
提高开发效率
2.1.3三大类
内置模块(python解释器自带的)
第三方模块(别人写的 可以下载共享的)
自定义模块(自己写的)
2.1.4四种表现形式
1.使用python编写的代码(.py文件)
2.已被编译为共享库或DLL的C或C++扩展
3.包好一组模块的包(文件夹) 包其实就是多个py文件(模块)的集合 里面通常含有一个__init__.py文件
4.使用C编写并连接到python解释器的内置模块
2.2import句式
1.import 模块名
2.导入文件
3.模块文件(导入的时候不要加文件后缀)
4.模块导入流程:
注意 多次导入相同模块 只会执行一次
4.1运行导入文件(import句式.py)产生该文件的全局名称空间
4.2运行模块名.py文件
4.3产生模块名.py全局名称空间 运行模块文件内代码 将产生的名字全部存档与模块.py名称空间
4.4在导入文件名称空间产生一个模块的名字指向模块.py全局名称空间
5.import句式导入模块之后 可以通过模块名点的方式使用到模块中所有的名字 并且肯定不会产生冲突(指名道姓的使用)
6.示例
eg
import md
md.change()
print(md.money)
2.3from...import...句式
1.from 模块名 import 模块中的名字
2.from...import...句式执行流程
注意 同样是多次导入相同模块也只会执行一次
2.1先产生执行文件的全局名称空间
2.2执行模块文件 产生模块的全局名称空
2.3将模块中执行之后产生的名字全部存于模块名称空间中
2.4在执行文件中有一个名字执行模块名称空间中的名字指向的值
3.在使用的时候直接写名字即可 但是当当前名称空间有相同名字的时候就会产生冲突 使用的名字就变成了当前名称空间
4.示例
eg
from md import money,read1,change
money = 999
print(money) # 这时输出的money就是当前名称空间里的 不是模块内的
def read1():
print('123')
read1() # 同上
2.4循环导入问题
1.循环导入是不允许的
2.解决的办法
2.1一错再错
2.1.1调换顺序
将彼此导入的句式放在代码的最后
2.1.2函数形式
将导入的句式放入函数体代码 等待所有的名字加载完毕之后再调用
2.4.1导入模块扩展用法
1.起别名
既可以给模块起别名也可以给模块中某个名字起别名
eg
import md as MD
from md import name as n
2.连续导入
import 模块名1,模块名2
可以连续导入多个模块 但是只有当多个模块功能相似或者属于同一个系列
如果功能不同并且不属于一个系列 建议分行导入
eg
import 模块1
import 模块2
from 模块名1 import 名字1,名字2,名字3
3.通用导入
from md import * # 将模块中所有的名字全部导入(*表示所有)
print(money)
print(read1)
print(read2)
__all__ = ['money','read1'] # 在被导入的模块文件中可以使用__all__指定可被导入使用的名字
2.5判断文件类型
如何判断py文件时作为模块文件还是执行文件
1.__name__当文件时执行文件的时候会返回__main__
2.如果文件是被当作模块导入则返回文件名(模块名)
3.示例
if __name__ =='__main__':
read1()
提示 在pycharm中可以直接敲main再按tab键自动补全if判断
2.6模块导入的顺序
1.先从内存中查找
2.再去内置模块中查找
3.最后去sys.path系统路径查找(自定义模块)
最后 如果都没找到 则会报错
注意 在给py文件命名的时候尽量不要与内置模块名冲突
4.当自定义模块查不到的时候解决方案
4.1自己动手将模块所在的路径添加到sys.path中
import sys
sys.path.append(路径)
4.2from...import...句式
from文件夹名称.问价夹名称 import 模块名
from 文件夹名称.模块名称 import 名字
2.7绝对导入与相对导入
2.7.1绝对导入
始终按照执行文件所在的sys.path查找模块
2.7.2相对导入
能够打破始终以执行文件为准的规则 只需考虑两个文件之间的位置
句点符(.)
.表示当前文件路径
..表示上一层文件路径
注意: 相对导入只能用在模块文件中 不能在执行文件中使用