模块
什么是模块?
模块是一系列功能的结合体,模块本质上是一个个的.py文件
模块的三种来源
1.python内置的模块(python解释器的),比如sys/time/os/turtle
2.第三方的模块(别人写的),比如requests
3.自定义的模块(自己写的),比如自定义的.py文件
模块的四种表现形式
1.使用python编写的py文件
2.编译后的共享库DLL(动态链接)或者是C或者是C++
3.包下面带有init.py的一组py文件
4.python解释器下的py文件
为什么要使用模块?
模块可以帮我们更好地管理功能代码,比如:函数
还可以将项目拆分成一个个的功能,分别存放在不同的py文件中
如何创建 编写模块 并使用模块?
鼠标右键创建py文件
-
在py文件编写python代码
-
在一个文件中,通过import关键字导入模块
import 模块名注意: import 模块时,模块不能加.py后缀
-
在使用模块阶段,必须要注意,谁是执行文件,谁是被导入文件(被导入的模块)
-
模块在首次导入时,就已经固定好了,当前文件查找的顺序是先从内存中查找
#自定义模块,在py文件中编写代码 x = 1 def get(): print(x) def change(): global x x = 0 print(x) #调用上面自已定义的模块 import foo #导入模块foo a=foo.x #引用模块foo中变量x的值赋值给当前名称空间中的名字a foo.get() #调用模块foo的get函数 foo.change() #调用模块foo中的change函数
模块在导入时发生的事情:
1、执行源文件代码
2、产生一个新的名称空间用于存放源文件执行过程中产生的名字
3、在当前执行文件所在的名称空间中得到一个名字,该名字指向新创建的模块名称空间,若要引用模块名称空间中的名字,需要加上该前缀
import语句
-
给模块起别名 as
import 模块 as 模块的别名 -
模块的导入方式
import 模块,在执行文件中直接import导入
from 包/模块 import 模块/(函数名、变量名、类名)
#使用import foo导入模块后,引用模块中的名字都需要加上foo.作为前缀,而使用from foo import x,get,change,Foo则可以在当前执行文件中直接引用模块foo中的名字 from foo import x,get,change #将模块foo中的x和get导入到当前名称空间 a=x #直接使用模块foo中的x赋值给a get() #直接执行foo中的get函数 change() #即便是当前有重名的x,修改的仍然是源文件中的x #无需加前缀的好处是使得我们的代码更加简洁,坏处则是容易与当前名称空间中的名字冲突,如果当前名称空间存在相同的名字,则后定义的名字会覆盖之前定义的名字。 from foo import * #把foo中所有的名字都导入到当前执行文件的名称空间中,在当前位置直接可以使用这些名字
加上foo.作为前缀就相当于指名道姓地说明要引用foo名称空间中的名字,所以肯定不会与当前执行文件所在名称空间中的名字相冲突,并且若当前执行文件的名称空间中存在x,执行foo.get()或foo.change()操作的都是源文件中的全局变量x。
PS:第一次导入模块已经将其加载到内存空间了,之后的重复导入会直接引用内存中已存在的模块,不会重复执行文件
#可以用import语句导入多个模块,即写多行import语句
import module1
import module2
...
import moduleN
#还可以在一行导入,用逗号分隔开不同的模块
import module1,module2,...,moduleN
model1.py
from model2 import name
name = 'jason'
model2.py
from model1 import name
name = 'tank'
解决循环导入问题:
1.需要查找的名字放在导入模块的上方
2.在函数内部导入,将模块变成函数名称空间中的名字