一个函数封装一些数据,那模块可以对函数进行再一次打包,使用模块能极大地提高自身的开发效率,省去自己开发的时间,同时便于查找和修改,更有利于我们进行后期的维护
在python中,模块主要分为三类:内置模块,第三方模块和自定义模块;内置模块是python中自带的模块,编程过程中,用import导入的一般都是内置模块;python拥有强大的第三方模块,可以在pypi.org中查找相关的第三方模块拿来使用;那自定义模块对于我们来说,一个朋友py文件就是一个自定义模块.
模块导入:
模块的导入有两种方式,一种是import+模块名,另一种是from 模块名 import
import + 模块名,模块名是不需要加后缀名的,每个模块都是一个独立的名称空间,定义在这个模块中的函数,把这个模块的名称空间当做全局名称空间,这样我们在编写模块时,就不用担心我们定义在自己模块中的变量会在被导入时与使用者的全局变量冲突
import 模块名
import 模块名
import 模块名
import 模块名
import 模块名
执行结果: 只打印一次
from the yiyi.py
但是import导入时有一个缺点,就是它会把文件下的所有内容都导入进去,大量的占用内存,而在python中对它进行了优化,多次导入时会放到内存里,随时用随时取,避免重复导入.
另外一种导入模式就是 from 模块名 import ,可以指定导入的内容,也可以导入多个内容
from 模块名 import *,就相当于是import+模块名,这是不推荐使用的;此外,发from 模块名 import 导入多个模块时和import导入多个模块时是一样的,建议一行一行导入,最后结果显示也是一个
为了更加便捷的导入模块,我么可以给模块起别名.在文件操作中有句柄,那在模块导入中,as就相当于给模块起别名.
如:import 模块名 as 别名
from 模块名 import 功能1 as 别名 功能2 as 别名
__all__ = [' '],
自定义指定使用*的时候导入的内容,在导入的模块中写一个__all__ = [' '],这样就能在调用模块的文件中只导入后面列表中的内容
py文件的两种功能:
编写好的一个python文件可以有两种用途: 一:脚本,一个文件就是整个程序,用来被执行 二:模块,文件中存放着一堆功能,用来被导入使用
当文件被当做脚本执行时:__name__ 等于'__main__'
当文件被当做模块导入时:__name__等于模块名
if __name__ == '__main__': (自己写的代码,做测试)
__name__在被当做模块导入的时候,__name__就会变成被导入的模块名
__name__在本文件内就是'__main__'(字符串类型)
if __name__ == '__main__': # 当前文件的测试
pass # 要执行测试的内容
foo('我在当做模块在使用')
模块中路径的搜索:
在from中,一个点是下一级; ../是返回上一级
from 模块名 import 功能,当模块名和当前文件在一个大的目录下时.可以直接写文件的名字
当模块名和当前文件不在一个大的目录下时,就需要进行跨盘操作,首先要导入sys模块,把要使用的模块路径添加到系统的环境变量中
import sys
sys.path.insert(0,'文件路径') 系统环境变量
模块重载:
一个文件当做模块被使用的时候,如果改变了模块中的一些代码,在这时就需要重新运行一次,导入这个新的文件
test.py,
print(111)
foo.py
from test import *
循环导入:这是一个经常会犯得错误,会报错;在导入的时候形成了一个环状,解决的方法就是加入一些条件,打破循环
编译文件:被导入的模块会生成一个pyc后缀名的字节码,这样能提升加载,编译的效率,当原文件修改时,就会把pyc文件重新写一份
test.cpython-36,此文件的后缀是pyc,是字节码,能提高编译的效率