认识模块
模块简介
1.什么是模块
一系列功能的结合体
2.为什么要用模块
开发的效率高(站在巨人的肩膀上写代码)
3.模块三种来源
- 第三方的 ( 别人写好的 )
- python自带的内置模块(可以直接调用)
- 自定义的模块
4.模块的四种表现形式
-
python编写的py文件
-
已被编译为共享库或DLL的C或C++扩展
-
文件夹下的一组模块的包(文件夹下的各种py文件)
包里面通常含有一个_ _ init _ _.py文件
-
使用C编写并链接到python解释器的内置模块
模块的好处:
学习完模块之后 以后我在编写大型项目的时候
遇到一些比较复杂的功能可以先考虑是否有相应的模块可以调用
import句式
用法:
import + 模块名或py文件名(文件的后缀不加 )
就可以调用模块了
ps:多次导入同一个模块,只会执行一次
导入发生的过程
- 在执行文件的内部创建一个全局名称空间,然后运行模块文件
- 在模块文件内创建一个全局名称空间,把产生的名字和该名称空间绑定
- 在执行文件的名称空间产生一个模块名的名字指向模块的全局名称空间
import句式导入模块之后
通过模块名点的方式就可以使用到模块中所有的名字 并且肯定不会产生冲突(指名道姓)
from...import...句式
from 模块名 import 变量名(可以是多个)
可以指名道姓的调用模块内某一值或功能,其他功能不会调用
但是当执行文件内命名和模块内命名重复会冲突,会按执行文件的命名运行
eg:
module文件:
s = '什么?86上山了!'
from module import s
s = '86直接排水渠过弯'
print(s) # 86直接排水渠过弯
导入发生的过程
以from md import money为例子
- 在执行文件的内部创建一个全局名称空间
- 调用模块后再创建一个模块md的全局名称空间
- 把产生的名字和md名称空间绑定
- 在执行文件的内部有一个money指向md全局名称空间中money指向的值
导入模块扩展用法
- 连续导入
import 模块名1,模块名2
import 后面可以跟多个模块名,推荐跟多个的时候模块之间的功能类似
不然还是建议一行一行的import导入
from 模块名1 import 名字1,名字2,名字3
-
起别名
既可以给模块名起别名也可以给模块中某个名字起别名
import mdddddddd as m # 之后调用就只需要写m就可以直接调用了 from mddddddd import name as n # 之后调用name就直接写n就可以直接调用了
-
通用导入
from...import...后面可以加*号,表示导入所有的名字( *号表示所有)
print(money)
print(read)
print(change)
但是如果py模块文件内写_ _ all_ _ = ['money', 'read'] 就会只能调用写出的这些功能,其他功能不可调用( 这里change就不能被调用)
ps: all里面的名字必须写成字符串的形式
判断文件类型
判断py文件是作为模块文件还是执行文件:
_ _ name _ _ 当文件是执行文件的时候会返回 _ _ main _ _
如果文件是被当做模块导入则返回文件名(模块名)
if __name__ == '__main__':
read1()
# 当模块内写这个if语句,可以让其他人调用该模块的时候运行到这就会停止
# 而执行模块文件就会继续执行下面代码
在pycharm中可以直接敲 main按tab键即可自动补全if判断
循环导入
在a文件中调用b模块
b模块里写入了c模块的变量名,然后调用c模块
c模块里写入了b模块的变量名,然后调用b模块
这样就会报错,因为各自都取不到需要的变量名就开始调用其他模块
# 以后我们在导入模块的时候如果出现了循环导入的情况 说明你程序设计的不合理
# 记住在以后的编程生涯中不允许出现循环导入的现象!!!
解决方案:
其实就是一错再错
1.调换顺序
将彼此导入的句式放在代码的最后
2.函数形式
将导入的句式放入函数体代码 等待所有的名字加载完毕之后再调用
模块导入的顺序
- 先在内存中找
- 再去内置模块里找
- 然后去sys.path系统路径中去找(自定义模块)
ps:以后在给py文件命名的时候尽量不要与内置模块名冲突
当某个自定义模块查找不到的时候解决方案
1.自己手动将该模块所在的文件夹的绝对路径添加到sys.path中,用append追加
import sys
sys.path.append(r'D:\py20\day18\aaa')
-
from...import...句式
from 文件夹名称.文件夹名称 import 模块名
from 文件夹名称.模块名称 import 名字
# 一定一定要记住 # 永远要以 当前执行文件 为基准,再去查找路径!!!!!!!
绝对导入与相对导入
绝对导入
始终按照执行文件所在的sys.path查找模块
相对导入
句点符(.)
.表示当前文件路径
..表示上一层文件路径
能够打破始终以执行文件为准的规则 只考虑两个文件之间的位置
相对导入只能用在模块文件中 不能在执行文件中使用
ps:在程序中涉及到多个文件之间导入模块的情况 一律按照执行文件所在的路径为准