模块

1.模块介绍

在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护。

为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式。在Python中,一个.py文件就称之为一个模块。

2.使用模块的好处:

最大的好处是大大提高了代码的可维护性。其次,编写代码不必从零开始。当一个模块编写完毕,就可以被其他地方引用。我们在编写程序的时候,也经常引用其他模块,包括Python内置的模块和来自第三方的模块。

使用模块还可以避免函数名和变量名冲突。相同名字的函数和变量完全可以分别存在不同的模块中,因此,我们自己在编写模块时,不必考虑名字会与其他模块冲突。但是也要注意,尽量不要与内置函数名字冲突。点这里查看Python的所有内置函数。

3.模块分类

模块分为三种:

(1).自定义模块

(2).内置标准模块(又称标准库)

(3).开源模块

4.模块导入

(1)import xxx

直接导入模块.

导入时执行的动作:

产生一个新的名称空间;

在新建的名称空间里面执行模块(.py)的内容;

拿到模块名,执行模块文件产生的名称空间。

(2)import xxx as yyy

导入模块并重新赋予一个名字(不会改变模块本身的名字)

(3)from ... import xxx

从一个模块里导入函数、变量、装饰器等......

from ... import 将某个模块的所有内容导入。代表所有。

用这种格式导入的时候iu,可以在模块中添加代码:

__all__ = [这里写允许从这个模块导入的内容]

例如:

import time
a = 100
def runTime(fun):
def wrapper():
start_time = time.time()
fun()
end_time = time.time()
print('%.8f' %(end_time-start_time))
return wrapper
def hello():
print("hello hello")
#__all__用来控制from xxx import *导入的内容,此处表示只允许导入装饰器rumTime和变量a,而方法hello则不会被导入。
__all__ = ['runTime','a']
hello()
from ... import xxx as yyy

导入内容并重新命名。

5.常用内置模块

6.模块导入时查找顺序

在导入模块时,模块在python中的查找顺序为:

内存中已经加载的模块-->内置模块-->sys.path目录里面的模块

内存中已经加载的模块:pythonj解释器在启动时默认自动加载的模块,可以通过sys.modules查看,sys.modules是一个字典,由模块名和模块信息构成键值对。

sys.path记录了导入模块的搜索路径,按照路径的先后顺序去搜索。

注意:自定义模块时,模块名字不要和内置模块冲突,否则导入的是自定义模块,无法导入系统内置模块。

7.解决问题

1.在导入模块时,模块中的执行结果会和当前.py文件中执行结果一起显示。

例如:

有一个myRunTime模块如下:

import time
a = 100
def runTime(fun):
def wrapper():
start_time = time.time()
fun()
end_time = time.time()
print('%.8f' %(end_time-start_time))
return wrapper
def hello():
print("hello hello")
hello()

将模块导入:

import time
import myRunTime
@myRunTime.runTime
def new_hello():
time.sleep(2)
print('new hello')
new_hello()

运行会发现,模块中的内容也显示了出来。

python 常用 包_python 必备模块和包

解决办法:

在模块中添加一行代码:

import time
import myRunTime
a = 100
def runTime(fun):
def wrapper():
start_time = time.time()
fun()
end_time = time.time()
print('%.8f' %(end_time-start_time))
return wrapper
def hello():
print("hello hello")
if __name__ == "__main__": #这是添加的代码。判断这个文件是否被作为模块导入。否,则执行if下的语句。是,则不执行。
hello()

现在运行就不会有模块中的执行结果了。

python 常用 包_python 常用 包_02

__name__所在文件没有被当作模块导入,其值为__main__

__name__所在文件没被当作模块导入,其值为模块的名称

8.第三方模块导入

(主机要能联网)

1.在shell环境中用pip3安装。

pip3 install 模块名

2.在pycharm中安装

按ctrl+alt+s键进入模块管理界面,点击模块列表右边的"+"号按钮,进入搜索模块页面搜索选择模块然后安装。

1.包的含义

包是一种管理 Python 模块命名空间的形式,采用"点模块名称"。

如果不同的人编写的模块名相同怎么办?为了避免模块名冲突,Python又引入了按目录来组织模块的方法,称为包(Package)。

比如一个模块的名称是 A.B, 那么他表示一个包 A中的子模块 B 。

就好像使用模块的时候,你不用担心不同模块之间的全局变量相互影响一样,采用点模块名称这种形式也不用担心不同库之间的模块重名的情况。

这样不同的作者都可以提供 NumPy 模块,或者是 Python 图形库。

举个例子:

一个abc.py的文件就是一个名字叫abc的模块,一个xyz.py的文件就是一个名字叫xyz的模块。

现在,假设我们的abc和xyz这两个模块名字与其他模块冲突了,于是我们可以通过包来组织模块,避免冲突。方法是选择一个顶层包名,比如mycompany,按照如下目录存放:

python 常用 包_Python_03

引入了包以后,只要顶层的包名不与别人冲突,那所有模块都不会与别人冲突。现在,abc.py模块的名字就变成了mycompany.abc,类似的,xyz.py的模块名变成了mycompany.xyz。

请注意,每一个包目录下面都会有一个init.py的文件,这个文件是必须存在的,否则,Python就把这个目录当成普通目录,而不是一个包。init.py可以是空文件,也可以有Python代码,因为init.py本身就是一个模块,而它的模块名就是mycompany。

类似的,可以有多级目录,组成多级层次的包结构。比如如下的目录结构:

python 常用 包_Python_04

文件www.py的模块名就是mycompany.web.www,两个文件utils.py的模块名分别是mycompany.utils和mycompany.web.utils。

mycompany.web也是一个模块,因为该目录下有一个init.py的文件。

如果对包还有一些疑惑,可以参考:菜鸟教程python3-模块与包