为此 Python 提供了一个办法,把这些定义存放在文件中,这个文件被称为模块。
模块是一个包含所有你定义的函数和变量的文件,其后缀名是.py。模块可以被别的程序引入,以使用该模块中的函数等功能。
你也许还想到,如果不同的人编写的模块名相同怎么办?为了避免模块名冲突,Python又引入了按目录来组织模块的方法,称为包。
一个.py文件就称之为一个模块
举个例子,一个a.py
的文件就是一个名字叫a
的模块,一个b.py
的文件就是一个名字叫b
的模块,一个c.py
的文件就是一个名字叫c
的模块。
创建自己的模块时,要注意:
- 模块名要遵循Python变量命名规范,如果线上项目不要使用中文、特殊字符。线下自己使用可以用中文,方便归类管理。
- 模块名不要和系统模块名冲突,最好先查看系统是否已存在该模块。
- 自己创建模块时要注意命名,不能和Python自带的模块名称冲突。例如,系统自带了sys模块,自己的模块就不可命名为sys.py,否则将无法导入系统自带的sys模块。
模块名字与其他模块冲突
我们的a
和b、c这些模块名字与其他模块冲突了,于是我们可以通过包来组织模块,避免冲突。方法是选择一个顶层包名,比如【文章】,因为本地自己使用所以使用中文。为什么选择python2,而不是python2很大原因就是中文编码的支持。
引入了包以后,只要顶层的包名不与别人冲突,那所有模块都不会与别人冲突。现在,【a.py】模块的名字就变成了【文章.a】,类似的,【b.py】的模块名变成了【文章.b】,【c.py】的模块名变成了【文章.c】。
请注意,每一个包目录下面都会有一个__init__.py的文件,这个文件是必须存在的,否则,Python就把这个目录当成普通目录,而不是一个包。__init__.py可以是空文件,也可以有Python代码,因为__init__.py本身就是一个模块,而它的模块名就是【文章】。
import 语句
把一个包、模块全部引入。语法如下:
一个import引入多个模块逗号隔开。多个import引入模块换行。语法如下:
推荐使用多个import引入模块换行。
使用格式:分别引入了两个内置模块datetime和time。其中长方形里面代表的是模块名。
别名:有些模块名很长,不想写这么长和记那么多,就取别名。
from … import 语句
语法如下:
实例引入:
使用介绍:直接使用,不需要模块名。
import 语句和from … import 语句的使用区别:
- import 语句中使用格式:模块名.方法(属性)。
- from … import 语句中都是不需要模块名,直接使用方法(属性)。
if __name__ =='__main__':
一个模块被另一个程序第一次引入时,其主程序将运行。如果我们想在模块被引入时,模块中的某一程序块不执行,我们可以用__name__属性来使该程序块仅在该模块自身运行时执行。
定义a和b两个函数,用if __name__ =='__main__':分开
如果看标准的语意许多人都摸不着头脑。我也是学习和找很多资料才弄明白。如果理解就感觉很简单。
执行a和b函数:
输出结果:
在当前文件中可以执行a和b两个函数,如果其他模块把当前文件当做模块引入。
只能执行a函数,找不到if __name__ =='__main__':下面的b函数,执行b函数报错提示没有定义。
这样子可以把if __name__ =='__main__':看成是一条分割线,分为上下两部分。
如果在当前文件就可以运用所有,其他文件引用就只能运用if __name__ =='__main__':上面部分,下面部分就不可以运用。
说明:
每个模块都有一个__name__属性,在它们自己的模块里值都是'__main__'。但是被其他地方引用就不是'__main__',而是文件名。
比如a.py和b.py,本来a和b 的__name__的值都是'__main__'。但是a把b引入,b在a中的__name__=='b.py',b.py不等于a.py。所以不能用b.py if __name__ =='__main__':下面部分的代码。