一、模块:
- 什么是模块:模块是一些功能的集合体,(最小的模块就是包含了一组功能的python文件)可以通过导入模块来重复使用模块里的所有功能。
- 模块的四个通用类别:
- 使用python编写的.py文件。
- 把一系列模块组织到一起的文件夹(注:文件夹下有一个__init__.py文件,该文件夹称之为包)
- 已经被编译为共享库或DLL的C或C++扩展
- 使用C编写并链接到python解释器的内置模块
- 为什么要用文件:1从文件级别组织程序,更方便管理。
2拿来主义,提升开发效率。
二、Import的使用:(导入模块)
1、模块可以包含可执行语句和函数,模块名第一次遇到导入import语句时才被执行,针对同一个模块可以在程序中的任意位置多次导入。
(注意:同一个模块在进行多次import时,只有第一次导入时才执行模块内部代码,其余import不执行模块内部代码,)
2、注意:在第一次导入后,模块就被加载到内存,此处注意查找模块的优先级顺序为: 内存、内置函数、环境变量(sys.path),所以模块内部保存在内存中的值有可能会在执行时被改变。
3、在第一次导入模块时会做三件事情,重复导入会直接引用内存中已经加载好的结果:
- 为源文件(导入的模块)创建名称空间。(在模块中定义的函数和方法若是使 用到了global 时,访问到的就是这个名称空间)
- 在新创建的命名空间中执行模块中包含的代码。将产生的名字丢到模块的名称 空间里。
- 创建以模块名来引用该命名空间。
(注意:每个被导入的模块都有自己独立的名称空间,定义在这个模块中的函数把这个名称空间当做全局名称空间,与使用者的全局变量不冲突)
4、import spam as sm (模块改名)
可以应用于if 判断,比如选择不同的阅读方式:导入多种不同的阅读方式模块,并将每一个模块名都改名为sm。最后通过if 选择要导入一个模块,不管导入到的是哪一个都能执行sm.func()
5.import 可以在一行导入多个模块:
Import sys ,os,re
- 总结import:(访问模块中的变量时,必须加前缀,不会冲突)
优点:指名道姓地问某一个名称空间要名字,不会与当前执行文件名称空间中的名字冲突。
缺点:引用模块中的名字必须加前缀,不过简洁
三、from ...import...的使用:
- from 模块名 import 模块中的函数名等:直接将该模块中的该名字直接导入当前
名称空间。
from 文件夹名 import 模块名:将文件夹中的模块导入当前名称空间
- form模块名 import * :表示把该模块中的所有不是以下划线(_)开头的名字
都导入当前位置。
优点:在当前名称空间中,直接使用名字就可以了,无需加前缀。
缺点:容易与当前执行文件中的名字冲突。
其余与import均无区别,也可以进行相应操作,如改名,一行多个名字等等。
四、模块循环/嵌套导入抛出异常的原因是由于在python中,模块被导入一次之后,重新导入,只会在第一次导入时执行模块内的代码。
五、py文件区分的两种用途:模块与脚本
- 脚本:一个文件就是整个程序,用来被执行。内置全局变量__name__的值为”__main__”
- 模块:文件中存放着一堆功能,用来被导入使用。内置全局变量__name__的值为模块名。
可以用内置全局变量__name__进行判断。
六、模块搜索路径:
- 模块的查找顺序:内存中已经加载好的模块-->内置模块-->sys.path中包含的模块。
按照顺序依次查找。如果内存中有,直接引用,不重复执行代码。
定义的模块名不应该与内置的模块重名。
- 路径的插入方式有两种,分别问append(路径)和insert(0,路径),insert方法插入能够将路径插在列表的第一位,这样会优先被加载。