模块的分类:
- 第一类: 内置模块,也叫标准库.次来模块是Python解释器提供的,比如time,os模块.标准库模块有200多种.
- 第二类: 第三方模块,第三方库. 一些Python大神写的非常好用的模块,必须通过pip install指令安装模块.比如BeautifulSoup , Django等.大概有6000多种.
- 第三类: 自定义模块. 自己在项目中定义的一些模块
6.1 自定义模块
1) import 模块名 ---- 导入某模块
第一次导入模块执行三件事
- 创建一个以模块名命名的名称空间
- 执行这个名称空间(导入模块) 里面的代码
- 通过此模块名 . 的方式引用该模块里面的内容(变量,函数名,类名等)
被导入的模块有独立的名称空间: 每个模块都是一个独立的名称空间,定义在这个模块中的函数,把这个模块的名称空间当做全局名称空间,在编写自己的模块时,就不用担心我们定义在自己模块中全局变量会在被导入时,与使用者的全局变量冲突.
可以为模块起别名: import 模块名 as 别名
- 可以将很长的模块名改成很短,方便使用
- 有利于代码的扩展和优化
导入多个模块: 推荐一个一个导入 -- 多行导入:易于阅读,易于编辑,易于搜索,易于维护
2) from...import...
from 模块名 import 变量,函数名
from...import... 与import对比: 使用from...import...是将模块中的名字直接导入到当前的名称空间中,所以在当前名称空间中,直接使用名字就可以了.无需加前缀:模块名.
form..import.. 的方式有好也有坏:
- 使用起来方便
- 容易与当前执行文件中的名字冲突.如果执行文件有与模块同名的变量或者函数名,就会有覆盖效果.
3) from...import*
from ... import * 与__all__
配合使用(写在模块文件中)
__all__
= ['name','read1'] 写在模块文件中,控制 * 的取值范围 只导入模块中的两个函数
4) py文件的两种功能
编写好的一个Python文件可以有两种用途
- 脚本,一个文件就是整个程序,用来被执行
- 模块,文件中存放着一堆功能,用来被导入使用
Python为我们内置了全局变量__name__
-
当文件被当做脚本执行时:
__name__
等于__main__
-
当文件被当做模块导入时:
__name__
等于模块名- 作用: 用来控制.py文件在不同的应用场景下执行不同的逻辑(或者是在模块文件中测试代码)
print('from the ABC.py') __all__ = ['name', 'read1',] name = 'aaa' def read1(): print('tbjx模块:',name) def read2(): print('tbjx模块') read1() def change(): global name name = 'barry' if __name__ == '__main__': # 在模块文件中测试read1()函数 # 此模块被导入时 __name__ == tbjx 所以不执行 read1()
5) 模块的搜索路径
内存中已经加载的模块->内置模块->sys.path路径中包含的模块
模块的查找顺序
- 在第一次导入某个模块时,会先检查该模块是否已经被加载到内存中(当前执行文件的名称空间对应的内存),如果有则直接引用(ps:python解释器在启动时会自动加载一些模块到内存中,可以使用sys.modules查看)
- 如果没有,解释器则会查找同名的内置模块
- 如果还没有找到就从sys.path给出的目录列表中依次寻找模块文件。
# 寻找模块的路径: 内存 ----> 内置模块 ---> sys.path中找
# 只要这三个地方:内存 内置模块 sys.path可以找到这个引用的模块的路径,这个模块就可以直接引用到.
# 如何引用到tbjx1.py
import sys
# print(sys.path) 是一个列表
sys.path.append(r'D:s23day15')
import tbjx1
tbjx1.read1()