模块与包

print('模块的使用')
'''
一.模块介绍
1,什么是模块?
模块就是一组功能的集合体,模块的组织形式有以下几种
1,一个python文件就是一个模块,文件名是module.py ,模块名就是mudule(自定义模块的常用格式)
2,已被编译为共享库或者DEL的C或者C++ 扩展
3,使用C编写并且连接到python解释器的内置模块
4,把一系列文件组织到一起的文件夹(注: 文件夹下面有一个__int__.py文件,该文件称之为包)
2,为什么要用模块?
1,自定义模块可以将程序中频繁用到的一些公共的功能组织到一个文件中,从而减少代码冗余
2,直接使用内置的或者第三方的模块中的功能,这种拿来主义可以提升开发效率
3,如何用模块?
##1,导入模块: import 模块名(不能带后缀py)
##2,首次导入模块都发生了那些事情?
# 2,1,会先产生一个模块的名称空间
# 2.2,会执行被导入模块文件的代码,将产生的名字放到模块的名称空间中
# 2.3,会在当前的名称空间中拿到一个模块名,该模块名指向模块的名称空间
如何用模块?

但凡来自spam名称空间中的功能,执行中都是以模块自己的名称空间为准的

import 导入模块的方式,在引入模块名称空间中改名字时,必须加上前缀,模块名.
优点:指名道姓的访问模块名称空间中的名字,肯定不会与当前名称空间中的名字发生冲突
缺点:每次引用模块名称空间中的名字都需要加上前缀,在模块名过长时,前缀会显得非常臃肿累赘
改进的方法:
import 模块名 as 别名 (类似于 open ..as.. )


##推荐多行导入
import os
import time
import spam

##也可以一行导入多个模块,中间用逗号进行隔开
import os,time ,spam




from...import...导入模块
x = 1
y = 2
1,from spam import money 首次导入模块也做三件事
1.1 首先产生一个模块的名称空间
1.2 会执行模块文件的代码,将产生的名字放到模块的名称空间中
1.3 会在当前的名称空间中直接拿到一个模块名称空间中的名字

2,使用:可以不用加前缀直接使用

from spam import money,read1,read2
print(money)
print(read1)
print(read2)

优点:简洁
缺点:容易与当前名称空间中的名字混淆冲突
from spam import money,read1,read2
money = 1
print(money)
print(read1 )

强调:来自于模块名称空间中的函数一定是以模块名称空间为准的


from spam import money,read1,read2
如果spam 中的名字很多时,我们不可能一个一个全部写出来,这时候我们可以采用下面这种做法:
from spam import *
表示将spam中的所有名字全部导入进来,
但是这个一般不推荐使用,
因为你将这个spam 中的所有名字全部导入了进来,你无法知道具体导入了多少的名字,以及每个名字
是怎样的,这样容易与当前名称空间中的名字冲突,
如果你不将全部导入的话,你还可以在当前名称空间中定义名字的时候注意避免重复,避开导入的名字
不推荐使用* 除非在我们需要引入模块中很多名字时,可以用* 起到一个节省代码的作用


from spam import money as m:
print(m) ### 等价于print(money)
这个也可以给他起别名


模块的嵌套导入与循环导入
大前提:在PYTHON中,一个模块,但凡被导入一次,下一次导入就会直接引用上一次导入的结果,不会再执行文件

在python程序中,要尽量避免这种循环嵌套导入,如果避免不了,为避免代码执行的过程中出错
可以采用以下几种方法:
1,将导入模块的语句放在定义变量的语句之后###一般不采用
2,推荐使用:如果两个文件:A文件需要B文件中的数据,B文件需要A文件中的数据,那可以将AB;两个文件中的数据都导入到C文件中,这样就可以避免循环导入


区分文件用途的文件的两种用途:
要么座位主函数被执行,这个时候__name__的值为__mian__
要么被其他函数调用,这个时候__name__的值为 模块名
print(__name__)####当文件被当做脚本执行时,__name__的值为__main__
###当文件被导入时,__name__的值为 模块名
当我们编写一个文件的时候,我们希望他被调用的时候才执行某行代码,可以使用
if __name__ == '__main__ :
代码1
代码2
else:
代码3
代码4

直接敲打main 回车 就可以出现下面这一行代码
if __name__ == '__main__':
pass
pass





模块的搜索路径
查找模块的顺序
1,内存====>内置===>sys.path=====>

# import sys
# print(sys.path)
import sys
sys.path.append(r'D:\pythonstudy\execise\homework\day6\上午')
###注意这里添加的路径只需要到asd所在路径的上一层文件夹,不需要到该文件本身
import asd
print(asd.money)


当需要导入的文件在执行文件的平级或者平级的分支的时候
可以采用from 当前文件夹的名字.下一层的文件夹名字 import 模块名
例如
from dic1.dic2 import sss
print(sss.money)
当前的执行文件的路径在dic1下面

总结:
1,当要导入的文件和当前的执行文件,在同一目录下面,平级,可以直接导入
2,当要导入的文件在当前执行文件的的平级文件的下方的时候,可以采用
可以采用from 当前文件夹的名字.下一层的文件夹名字 import 模块名
3,当要导入的文件在很远的路劲的时候,可以采用:
import sys ##先导入系统资源管理的这个库
sys.path.append(r'需要导入的文件的上一层文件夹路径')
将需要导入的文件的路径添加到环境变量中之后,就可以直接导入了,这样就可以查找到了


'''


上一篇:模块


下一篇:import与from...import...