-
存储着很多常用功能的一个py文件就是一个模块.模块就是一系列常用功能的集合体.
-
为什么要使用模块?
- 组织结构更清晰,方便管理,易维护
- 拿来主义,节省代码,大大提升开发效率
-
py文件两种功能:
- 执行文件(承载代码),俗称脚本
- 模块(被引用,被执行)
-
模块的分类
-
内置模块,也叫标准库.此类模块就是python解释器提供的,time,os等200多种
-
第三方模块,第三方库,各种python大神写的非常好用的模块,必须通过pip install 指令安装的模块,比如Django等,大概有6000多个
-
自定义模块,我们自己定义的一些模块
# 示例 # haha.py name = '刘德华' lst = [1, 2, 3] def fucn(): print('haha模块', name) def change(): global name name = '张学友' def lst_append(): lst.append(4) # 这个haha.py文件就是一个模块
-
-
引用模块的方法
-
import使用: import 模块名
-
引用模块会做三件事:
- 创建一个以模块名命名的名称空间,类似全局名称空间(这里保存的是变量和值的对应关系)
- 执行这个名称空间(即导入的模块)里面的代码,将其加载到内存.(如果多次导入,则只有第一次会执行代码)
- 通过此模块名.的方式引用模块里面的内容(变量,函数名,类名等).这个名字和变量名没有区别,都是'第一类的'.并且模块中定义的名字与执行文件中的名字来自两个完全不同的地方
-
被导入的模块有独立的名称空间
-
每个模块都是一个独立的名称空间,定义在这个模块中的函数,把这个模块的名称空间当做全局名称空间,这样我们在编写自己的模块时,就不用担心我们定义在自己模块中的全局变量会在被导入时,与使用者的全局变量冲突.
# 示例 # 当前是 hello.py import haha name = '刘亦菲' print(name) # 刘亦菲 print(haha.name) # 刘德华
-
-
为导入的模块起个别名
# 方便书写 # 简化代码,可以用于统一接口 # 当前是 hello.py import haha as wow # as后面是想改的名字 print(wow.name) # 刘德华
-
引入多个模块
- 推荐多行逐个导入: 易于阅读 易于编辑 易于搜索 易于维护
-
-
from ... import ... 使用: from 模块名 import 变量名
-
from ... import ...引入时,也会开辟一个以模块名命名的名称空间,但是会把我们想要引入的具体内容(类如变量)的对应关系复制到当前执行文件的全局名称空间中. 注意: 因为复制的是对应关系,所以比较像浅拷贝.
# 例一 name = '刘亦菲' from haha import name print(name) # 刘德华
# 例二 from haha import name # 把模块空间内name的对应关系复制了过来. from haha import change # 修改模块空间内的name,但是name是不可变的数据类型,直接改变了指向. print(name) # 刘德华 ----------------------------------------------- # 例三 from haha import lst # 把模块空间内lst的对应关系复制了过来 from haha import lst_append # 修改模块空间内的lst,执行文件全局空间中的lst与模块空间内的lst指向同一个内存地址 print(lst) # [1, 2, 3, 4]
-
引用模块中的函数,如果此函数用到了一些变量,这些变量还是从此模块空间中寻找
-
优点: 使用起来方便了(不用模块名. ,而是直接使用)
-
缺点: 容易与当前执行文件产生覆盖效果,相当于变量的重新赋值
-
也可引入多个
-
也可以起别名
-
from...import* 尽量别用单独使用 拷贝全部
# 1,把模块中所有的不是以下划线(_)开头的名字都导入到当前位置 # 2,容易覆盖 # 可以使用__all__来控制* , 在模块文件中新增一行 __all__=['name','change'] #这样在另外一个文件中用from haha import *就这能导入列表中规定的两个名字
-
模块的搜索路径:
-
内存中已经加载的模块
-
内置模块中
-
sys.path给出的目录列表中
# 手动添加模块的路径 import sys sys.path.append(模块所在目录) import 模块
-
-
需要特别注意的是: 我们自定义的模块名不应该与系统内置模块重名
-
-