-
简述
-
什么是模块
我们之前在使用pycharm里创建的.py文件,这个.py文件包含了一组功能,例如:shopping.py 它的模块名为shopping,可以通过import shopping使用。
在python中,模块的使用方式是一样的,但实际上模块可以分为四个通用类别:
-
使用python编写的.py文件(自定义模块)
创建一个.py文件,把一堆函数写进去就是一个模块
-
已经被编译为共享库或DLL的c或c++扩展
了解如何使用
-
把一系列模块组织到一起的文件夹 (文件夹下有个init.py文件,该文件夹称之为包)
(留空 下次讲关于包知识点 补充)
-
使用c编写并连接到python解释器的内置模块
time模块 time.sleep()功能
内置模块不可能满足我们所有的需求,所以很多情况下需要我们自己自定义模块
-
-
为何要用模块
-
从文件级别组织程序,更方便管理,这样做能让程序的结构更清晰,方便管理。我们不仅仅可以把这样把这些文件当作脚本去执行,还可以把他们当作模块来导入到其他的模块中,实现了功能的重复利用。
-
拿来主义,提升开发效率,同样的原理,我们可以下载别人写好的模块,然后导入到自己的项目中使用。
-
-
模块的格式要求有哪些
.py就是一个模块。
# file:test.py
print('from test.py')
money = 100
def func0():
print('func0')
def func1():
print('func1')模块应该是一个工具箱里的工具,提供功能,所以不应该执行。
-
-
使用模块
使用关键字来导入模块
e.g.
import test #import + 模块名
# 执行模块的使用
# from test.py
test1.func0()
# func0 -
我们在执行模块import test时到底发生什么
当我们执行test.py,一旦执行一个py文件,就会产生一个该文件的全局名称空间,这个空间中存放着文件中名称和值的对应关系。
在执行import时 发生了三件事:
-
创建了一个名称空间
-
在新创建的名称空间中执行模块中包含的代码,
-
创建名字 test. + 名字 来访问文件中定义的名字
-
-
被导入的模块有独立的名称空间
每个模块都是一个独立的名称空间,定义在这个模块中的函数,把这个模块的名称空间当做全局名称空间,这样我们在编写自己的模块时,就不用担心我们定义在自己模块中全局变量会在被导入时,与使用者的全局变量冲突
-
import语句的其他写法
-
语法:import xxx as x
作用:取别名
-
语法:from xxx import xxx as x
作用:取别名
-
语法:import xxx,yyy,ddd
作用:导入多个模块
-
语法:from xxx import yyy
作用:简化书写,使用yyy不需要加前缀,直接可以使用,可能与当前名称空间冲突,如果冲突则按照就近查找的原则。
-
语法:from xxx import yyy,zzz
作用:从模块中导入多个名字,并且不需要加前缀
-
作用:
注意!该⽅方式会导⼊入模块中所有的命名空间到当前命名空间。如果模块中名称⾮非常多的话极易易产⽣生名称冲突 使⽤用时要⼩小⼼心
延伸: 模块中可以控制 * 能被导⼊入的名字 在模块⽂文件中加⼊入 __ all __=["名字1","名字2"] 注意值是字符串串类型
-
-
模块循环导入的问题
模块循环/嵌套导入抛出异常的根本原因是由于在python中模块被导入一次之后,就不会重新导入,只会在第一次导入时执行模块内代码
在我们的项目中应该尽量避免出现循环/嵌套导入,如果出现多个模块都需要共享的数据,可以将共享的数据集中存放到某一个地方
-
模块搜索路径
模块的查找顺序是:内存中已经加载的模块 > 内置模块 > sys.path路径中包含的模块
我们自定义的模块名不应该与系统内置模块重名