一:模块的定义
模块:就是一系列功能的集合体,分为三大类
1.内置(就是解释器里自带的)
2.自定义:可以是任何语言写的 (py文件本身就是一个模块,文件名叫xx.py,模块名就叫xx)
3.第三方:既不是自带的,也不是自己写的,是别人的直接拿过来
ps:模块分为四种形式
1.使用python编写的py文件
2.已被编译为共享库或是DLL的C或者C++扩展
3.把一系列模块组织到一起的文件夹(__init__.py文件,该文件称之为包)
4.使用C编写并链接到python解释器的内置模块
二:为何用模块
1.内置与第三方的模块拿来就用,无需定义,这种拿来主义,可以极大的提升开发效率
2,自定义的模块,可以将程序的各个部分功能提取出来放到一个模块中,为大家共同使用,这样减少了代码冗余问题,
首次导入模块会发生:
1,执行xx.py
2,产生xx.py的名称空间,将xx.py运行过程中产生的名字都丢到xx的名称空间中
3.在当前文件中产生的有一个xx,该名字指向2中产生的名称空间
之后再导入,都是直接引用首次导入产生的xx.py名称空间,不会重复执行
三:如何引用
1.模块名.名字,是指名道姓的问某一模块要名字对应的值,不会与其他名字产生冲突
2.无论是查看还是修改操作的都是模块本身,与调用位置无关,以定义的时候为准
四:导入多个模块的书写规范
导入多个模块,可以用 , 分隔模块,但是不建议 import time,name,age 建议使用如下: import time import name import age 导入模块时,先后顺序最好是: 1.导入内置模块 2.导入第三方模块 3.导入自定义模块 ============import......as..... import foo文件名 as 另起一个名字f # foo=f f.get() 用在当我的模块名比较长的情况下 ========自定义模块的命名应该采用纯小写+下划线的风格 =======可以在函数内导入模块
五:一个python文件的两种用途
1.被当成程序运行
2.被当作模块导入
如果foo文件下非得运行一下结果时: 当xxpy被运行时,__name__的值为'__main__',导它的文件则会把运行结果显示出来 当xx.py被当作模块导入时时,__name__的值为'xx',不会输出xx.py的运行结果 if ____name__=='__main__': get() 本文件内执行 change() else: 只是被当作模块导入
六:import和from....import的两种导入方式
=======================import导入模块时的优缺点 1.优点:肯定不会与当前名称空间中的名字产生冲突 2.缺点:导入模块在使用时必须加前缀"模块.",加前缀显得麻烦
=========================from....import xx不加前缀的另一种方法 from foo import x # x=模块foo中值11的内存地址 from foo import func from foo import change ======================from....import...导入发生的三件事 1.产生一个模块的名称空间 2.运行foo.py将运行过程中产生的名字都丢到模块的名称空间取 3.在当前名称空间拿到一个名字,该名字指向模块名称空间中的某一个内存地址 get() ==============优缺点 1.代码更简洁 2.缺点:容易与当前名称空间的名字混淆 ====================================也可以一行导入多个模块(不推荐) from foo import x ,func,change =====================================from foo import*,就是所有模块当中的名字都可以用(不推荐,只有需要导入模块中的名字很多的时候使用) from foo import* print(x) print(func) print(change) ============================================也可以取别名 ,但是针对的是对import后面的名字过长时 from foo import func as f
七:循环引用产生的问题
循环导入问题指的是在一个模块加载/导入的过程中导入另外一个模块,而在另外一个模块中又返回来导入第一个模块中的名字,由于第一个模块尚未加载完毕,所以引用失败、抛出异常
究其根源就是在python中:同一个模块只会在第一次导入时执行其内部代码,再次导入该模块时,即便是该模块尚未完全加载完毕也不会去重复执行内部代码
=======解决方法1:在共同被导入的模块当中,把被 引用到的名字全部放到最上面
=======解决方法2:放到一个函数体内,不要放到全局
==========================但是都不建议=======================================================
八:模块查找的优先级
1.内存(内置模块)
2.从硬盘找:也就是当前文件所在的位置(在哪个文件夹下)
import sys # 查找路径
print(sys.path) #值为一个列表,其中第一个就是当前执行文件所在的文件夹
# 被导入模块路径为'C:\\Users\\xx\\PycharmProjects\\pythonProject\\venv\\Scripts\\python36.zip',看后缀为zip
九:包(其实也是一个模块)
。
。
。