python中的模块、库、包有什么区别?

python中的模块、库、包有什么区别?

原创:气海同途
来源:python中的模块、库、包有什么区别?

Python的流行主要依赖于其有众多强大的功能,其自带的标准库(Standard Library)可以满足大多数的基本需求,除了函数库以外,模块(Module)和包(Package)也常会被提及。其中库、模块和包常常会分不清,本篇对这些做个区分。

模块(module)
1.1 什么是模块模块(module)是一个包含Python定义和语句的文件,也就是一个.py文件就可以称为一个模块。


通过使用模块,不仅可以有效地避免命名空间的冲突,还可以将一个较大的程序分为多个文件,提升代码的可维护性和可重用性。
比如下面的一个脚本calc_distance.py,计算球面两点间的距离就可以是一个模块。模块名就是文件名(calc_distance)。

·

'''说明文档:给定地球上两个点经纬度信息(单位:degree),计算两点之间距离(单位:km)。'''from math import sin,cos,asin,sqrtimport numpy as np
def SphereDistance(lon1, lat1, lon2, lat2): radius = 6378.135 # radius of Earth, unit:km dtor = np.pi/180.0 # degree to radians lon1 = lon1*dtor lat1 = lat1*dtor lon2 = lon2*dtor lat2 = lat2*dtor # degree to radians dlon = lon2 -lon1 dlat = lat2 -lat1 arg = sin(dlat*0.5)**2 + cos(lat1)*cos(lat2)*sin(dlon*0.5)**2 dist = 2.0 * radius * asin(sqrt(arg))return dist
if __name__ == "__main__": # test lon1 = 120.0 lat1 = 20.0 lon2 = 121.0 lat2 = 23.0 dist = SphereDistance(lon1, lat1, lon2, lat2) print(dist)

1.2 如何调用模块如果其他脚本需要调用上述模块,常见的方式如下:

#方式1:模块名import calc_distance#方式2:模块名取别名import calc_distance as calc#方式3:从模块导入函数并取别名from calc_distance import SphereDistance as SD#方式4:导入模块全部函数,此方式不推荐,容易出现重名函数以及可读性差from calc_distance import *


1.3 __name__ 的作用__name__是一个全局变量,不同场景下它的值是不一样的。(1)当模块作为脚本被直接运行的时候,__name__变量的值为"__main__";(2)当模块被其他脚本import调用时,该变量为模块文件名,也即__name__=="calc_distance";
一般我们编写一个模块时,都会进行一些测试,会大量输出的测试信息,而当模块被别的脚本调用执行时,这些测试信息输出是累赘的。利用__name__这个变量的特点,模块的测试就放在if __name__ == "__main__":之后,这样执行脚本本身测试信息正常输出,而别的脚本调用时则不会运行这些测试内容,也就不会输出测试的信息了。

1.4 说明文档模块的说明文档放在py文件的开头,用成对的三个英文单引号引起来,通过以下方式获取模块的说明文档。

import calc_distance as calcprint(calc.__doc__)


1.5 模块的路径用import语句导入的模块,Python会按照下列路径依次寻找目标模块:(1)当前的工作目录;(2)PYTHONPATH(这是一个环境变量)中的所有目录;(3)Python 默认的安装目录。

包(Package)

模块一般就是我们日常随手用的一些规模较小的代码,而在比较大规模的任务一般需要用到大量的模块,此时我们可以使用包(Package)来管理这些模块。我们平时下载的第三方包也就是这个,如Numpy,
2.1 什么是包?包,就是里面装了一个__init__.py文件的文件夹。__init__.py脚本有下列性质:(1)它本身是一个模块;(2)模块名不是__init__,而是包的名字,也就是装着__init__.py文件的文件夹名。(3)它的作用是将一个文件夹变为一个Python模块(4)它可以不包含代码,不过一般会包含一些Python初始化代码(例如批量导入需要的模块),在这个包被import的时候,这些代码会自动被执行。
2.2 导入包导入包的方法和导入模块比较类似,只不过由于层级比一般模块多了一级,所以多了一条导入形式.

import 包名.模块名import 包名.模块名 as 模块别名

三 库library

python库(library)的概念,网上搜到的信息也五花八门,没有一个统一的概念,主要总结为两种观点:
观点1:严格来说Python中是没有库(library)的概念,模块(module)和包(package)都是Python语法中有的概念,Python中的库是借用其他编程语言的概念,没有特别具体的定义,只是一个通俗的说法,平时说的库既可以是一个模块也可以是一个包。

观点2:从大到小的层级关系:库->包->模块。库是指具有相关功能模块的集合,是一个完整的东西,可以认为库是一个完整的项目打包,可直接调用或者运行,一个库中可能有多个包。

搜索到的答案中,大部分倾向于第一种观点。

最后总结就是:模块module:一个 .py 文件就是个模块,由函数和类组成;包package:多个模块放在一个文件夹,就是一个包;
库library:只是一个通俗的说法,平时说的库既可以是一个模块也可以是一个包。


参考:
zhihu.com/question/3008


发布于 2021-08-25 20:12