1 什么是模块?
模块就是一系统功能的集合体,在python中,一个py文件就是一个模块,比如module.py,其中模块名module
优点: 1.对写好的功能进行重用 2.拿来主义,提升开发效率
2.模块的分类:
2.1.自定义模块 * (第三方模块也属于自定义 它是别的程序员写的 ) 关注如何自定义
2.2.内置模块 是c语言写的 然后连接到python解释器中 例如 time模块 关注如何使用
2.3.已经编译为DLL c或c++ *** 不需要知道怎么来的 会用就行
2.4.包 ***** 包实际上是包含一堆模块的文件夹之后详细讲
对于这四种模块 它们的使用方式 是一致的
3.为什么要用模块
3.1减少编写重复代码,很多有现成的代码 直接拿来使⽤用
3.2.从⽂文件界别组织代码 是我们的代码结构更更加清晰
4.怎么用模块
首先要区分开当前执行文件和被导入模块两个概念
使用:在执行文件中使用关键字来导入模块:import+模块名 进行导入
4.1 模块的使用之import 导入模块
首次导入模块发生三件事
1、创建一个模块的名称空间
2、执行模块对应文件,将模块中产生的名字存放于第一步创建的名称空间中
3、在当前执行文件中拿到一个模块名,该模块名指向1的名称空间
(注意:在这里模块的名称空间和导入模块时的第三步执行文件产生的名称空间是相互独立的,第三步时,是产生一个执行文件的模块空间,然后在执行文件的模块空间中产生一个模块名,产生的模块名对应的是模块的名称空间产生的模块名)
导入模块时:简单来说就是得到了一个名称,这个名称指向被导入文件,有了这个名称就可以通过这个名称就找到被导入文件中的所有名称,即可以获得模块中的所有名称进而可以进行调用
使用import module导入模块的优缺点:
优点:指名道姓的引用摸个模块中的名字,不会与当前执行文件名称空间中的重复名字发生冲突
缺点:使用模块中的功能时需要加前缀: module.func
x=1
def f1():
pass
import spam
强调:之后的导入会直接引用第一次导入的结果,不会重复执行文件
import spam
import spam
import spam
import spam
import spam 在这里多次进行导入不会多次重复执行文件,后边的导入会直接引用第一次导入的结果
print(spam) 打印spam的话会出现关于模块spam的信息:<module 'spam' from 'E:\\Python 资料\\上海一期视频\\day14\\day14\\spam.py'>
print(spam.money) 打印spam红money的值
spam.read1() 调用模块中的read1函数的功能
模块中功能的执行始终以模块自己的名称空间为准
也可以说:执行文件与被导入文件的名称空间互相独立
read1=111111
print(spam.read1) 结果:<function read1 at 0x0000023F2036A950>
这里即使定义了一个read1,但是只要是调用spam中的read1,它始终是模块中的read1函数
money=1111111111111
spam.read1() 结果:spam模块.read1: 1000 不会因为在执行文件中定义了一个新的money而改变
read1=11111111111111111111111111
spam.read2() 结果:spam模块.read2: spam模块.read1: 1000 (read2中调用了read1)
money=1111111111111111
spam.change() 这里调用了spam模块中的change函数,change函数在spam模块中对money的值进行了修改
print(money) 这里打印的是执行文件中的money,打印结果为执行文件中定义的money=1111111111111111
spam.read1() 因为上面已经调用change对spam中的money修改,所以这里调用read1之后打印出来的monry值是被change修改过后 的值money=0
5.import语句的其他语法
5.1为模块起别名 (语法:import xxx as x 作用:简化书写)
import spam as sm
print(sm.money)
sm.read1()
engine=input('>>: ').strip()
if engine == 'mysql':
import mysql as db
elif engine == 'oracle':
import oracle as db
db.parse()
5.2一行导入多个模块(不推荐使用)(语法:import spam,mysql,oracle 作用:简化书写)
import spam,mysql,oracle
推荐写成多行
import spam
import mysql
import orcacle
6.模块的使用之from...import...导入模块
首次导入模块发生三件事
1、创建一个模块的名称空间
2、执行模块对应文件,将产生的名字存放于1中的名称空间
提示:from...import...与import前两件事一模一样
3、在当前名称空间中直接拿到模块中的名字,可以直接使用,不用加任何前缀
这里的第三步:直接拿到模块中的名字x时,拿到的名字x属于执行文件的名称空间,但是x是指向module中的x值
使用from...import...导入模块时的优缺点:
优点:在执行文件中使用模块中的功能时,不需要加前缀,直接引用模块中的名字就可以,代码会更加精简
缺点:容易与当前执行文件名称空间中的重复名字发生冲突
import spam # spam.名字
from spam import money,read1,read2,change
print(money) 这里可以直接打印出来spam中money的值
read1() 可以直接使用spam中函数功能,不需要加前缀
read2()
change() 在这里调用change时,修改的还是spam中money的值
print(money) 如果在这里打印money打印出来的还是使用from..import..导入进来的money=1000
import spam 使用import调用spam时,直接打印money打印的可执行文件中的money,不能打印spam中
print(money) money的值,当可执行文件中没有定义money时,程序会进行报错
注意:
1、同import,执行模块中的功能,始终以模块的名称空间为准
money=1111111111
change()
print(money)
2、from ... import 名字,拿到的名字可以不加前缀直接使用,使用起来更加方便
当问题是容易与当前执行文件中相同的名字冲突,起冲突时按照就近原则进行取值
money=1111111111111111
print(money)
read1=1111111
read1()
6.1起别名(语法:from xxx import xxx as x )
from spam import money as m
print(m)
6.2在一行导入多个(语法:from xxx import xxx,xx)
from spam import money,read1,read2
6.3导入所有:(语法:from ... import * ) 将模块中的所有名称全部拿到当前执行文件的名称空间中
from spam import *
print(money) money=1000
print(read1) 输出:<function read1 at 0x0000026A377DA950>
print(read2) 输出:<function read2 at 0x0000026A377DAA60>
print(change) 输出:<function change at 0x0000026A377DAB70>
全部导入时也是可控的:
__all__=['money','read1'] # from .. import *可以通过__all__来控制使用全部导入时导入的名称,允许导入的名称放到列表中
from spam import *
print(money)
print(read1)
print(read2)
7.py文件的两种执行方式 *
1.作为执行文件 (右键run) 执行文件就是当前正在编辑的py文件,右键即可运行
2.作为模块被导入 编辑完成的时,如果其他py文件需要已完成py文件中的功能时,py文件可以作为模块被导入
__name__ 这个名称 可以获取当前执行状态
如果__name__打印出来的结果是__main__ 说明当前文件是执行文件
否则 说明是作为模块
于是乎有了以下代码(可以将测试模块功能的代码写在里面)
if __name__ == "__main__":
print("作为执行文件")
else:
print("作为模块导入了")
8.模块的查找顺序是:1>>2>>3
1、内存中已经加载的模块(了解怎么使用)
2、内置模块(了解怎么使用)
3、sys.path路径中包含的模块(重点掌握)
查看内存中已经加载的模块可以使用sys.modules来查看,结果是一个字典
sys.path的意义和使用
sys,path表示的是,也就是打印出来时是一个列表,
执行可执行文件,这时候打印sys.path,列表中的第一个环境变量就是可执行文件所在的文件路径
在使用模块时如果模块文件名称不在可执行文件的sys.path要把模块名称的路径添加到sys.path的列表中,这样就不会出现掉用不了的错误
强调: sys.
import time
import m1
m1.f1()
time.sleep(15)
import m1
m1.f1()
print(__name__)
import sys
print('time' in sys.modules)
import time
time.sleep(2)
print('time' in sys.modules)
import sys
sys.path.append(r'D:\code\SH_fullstack_s1\day14\dir1')
import m1
m1.f1()
强调强调强调强调强调强调强调强调强调强调强调强调
sys.path的第一个路径是当前执行文件所在的文件夹