史上zui详细的Python模块讲解(python官方模块大全)
off999 2024-10-02 18:41 24 浏览 0 评论
前言;本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。
本文章向大家介绍史上最详细的python模块讲解,主要包括python模块化程序设计、模块化有哪些好处、什么是 python 中的模块、python引入模块的几种方式、模块的查找顺序、模块中包含执行语句的情况、用 dir() 函数来窥探模块、python 的内置模块有哪些等等,需要的朋友可以参考一下:
模块的概念你一定不会陌生吧,这是一个非常宽泛的概念,在各行各业都会用到。这里我们涉及的只是软件中的模块概念。说到模块,就得先了解下模块化程序设计的概念。(如果您对模块化程序设计的概念已经烂熟于心,尽可以略过,而直接跳到下一节)
模块化程序设计
模块化程序设计是指进行程序设计时将一个大程序按照功能划分为若干小程序模块,每个小程序模块完成一个确定的功能,并且在这些模块之间建立必要的联系,通过模块的相互协作完成整个功能的程序设计方法。
——百度百科
举个例子,假如我们要造一辆汽车,就可以先将汽车分成四个部件:发动机、底盘、电气设备、车身。每个部件都是一个模块,都会完成自己专属的功能,同时也预留了和其他部件配合的接口。当这几部分建造完成时,就可以组合在一起,从而完成了整个汽车的建造。
类比一下,汽车就是整个程序,而像发动机,底盘等就是程序中各个小的模块。只有当各个模块正常工作,并且暴露的接口和其他模块的接口完全契合,才能组合成一个完整且正常工作的程序。
模块化有哪些好处?
当然,如果不将程序分解成一个个独立的部分,而是整个一大坨,也能够完成所要的功能。那么为什么教科书还有实际使用中都会提倡模块化程序设计?这样做有什么好处呢?
- 控制程序设计的复杂度不知你看过《代码大全》没有,里面有一句非常著名的格言:软件的首要使命就是管理复杂度。完整的软件功能复杂度是非常高的,如果不使用有效的方法加以管理,很可能会陷入复杂的泥潭中不可自拔。而将程序分解成模块,则会将整体功能的复杂度有效的下分到各个模块中。每个模块只要能够管理好自己的复杂度就可以了。
- 提高代码的重用性还是以造汽车为例,假设我造了一个很牛的发动机,多款车型都可以使用它。程序设计也一样,如果一个模块能够完成特定的功能,且与父程序耦合度较小,多个程序都可以使用它。
- 易于维护和扩展小 A 写了一个程序,并将各个部分划分的非常明确,再加以人性化的函数命名和注释。即使有一天小 A 离职了,小 B 要接过来维护以及在此基础上再开发新的功能也不难。
既然模块化就这么多好处, 强大的 python 当然也会吸收这个优秀的设计思想,并且在语言中有所体现,那就是 python 的模块(module)。
什么是 python 中的模块?
先来看一个示例:
- 创建 python 文件 a.py,并在文件中定义函数 sumdef sum(a, b): return a + b
- 创建 python 文件 b.py, 并调用 sum 函数from a import sum print(sum(1, 2)) # 3
文件 a.py 就是一个模块(module),b.py就是一个主模块(main module)。
在 b.py 中有这么一句 from a import sum ,是指将模块 a 中的 sum 函数导入到当前模块中。我们定义的文件名是 a.py ,而模块名就是去掉后缀后得到的 模块 a。那么能不能再多导入几个函数或者导入模块 a 的全部函数呢?当然可以,这个我们后面讲。
调用模块时,通过文件名就可以确定模块的名字,那么在模块(module)内部,能知道自己姓甚名谁吗?还真能。
每个模块都有一个全局变量 __name__ ,它就是模块的名字。上面 a.py 的内容不变,修改下 b.py 的内容。
import a print(a.__name__) # a print(a.sum(1, 2)) # 3
来,一起总结下:
- python 模块(module) 是指包含 python 定义(包括 类,函数,变量)和语句的文件(.py做后缀)
- 模块名就是模块文件名称去掉.py 后缀
- 在模块内部,可以通过全局变量 __name__ 得到模块名称
引入模块有几种方式?
要导入模块并调用,前提要导入的 python 模块中有料(函数,变量,class)才可以。先来定义一个 python 模块 calc
def plus(a, b): return a + b def subtract(a, b): return a - b
再创建一个 main.py 文件,在其中做引入操作。okay,准备好了,那我们来逐个看下可以引入模块的方式吧。
- 引入整个模块,调用时需要加上模块名import calc print(calc.plus(1, 2)) # 3 print(calc.subtract(2, 1)) # 1
- 引入模块特定的函数或变量,调用时无需加模块名from calc import plus, subtract print(plus(1, 2)) # 3 print(subtract(2, 1)) # 1
- 引入整个模块,调用时无需加上模块名from calc import * print(plus(1, 2)) # 3 print(subtract(2, 1)) # 1
- 引入整个模块,并对模块重命名,调用时加上重命名后的模块名import calc as calculator print(calculator.plus(1, 2)) # 3 print(calculator.subtract(2, 1)) # 1
- 引入模块特定的函数或变量,并对其重命名,调用时无需加模块名from calc import plus as add, subtract as sub print(add(1, 2)) # 3 print(sub(2, 1)) # 1数一下,一共是 6 种方式,归纳一下就是 from , import , as , * 这些符号的组合而已。
模块的查找顺序
在上几篇文章中已经用了如 os,shutils,json 等多个模块 ,这些模块都是 python 的内置模块。相比之下,我们刚才使用的 calc 模块就是自定义模块。
假设我们使用 import calc 导入 calc 模块, python 在启动时按照什么样的顺序来查找这个模块呢?
- 先查找内置(built-in)模块中有没有,如果没有转到 2
- 查找 sys.path 变量指定的路径下有没有, 有的话就使用,没有就报错
sys.path 变量中存储了那些路径呢?
- 当前运行的 python 脚本所在的目录
- 环境变量 PYTHONPATH 中的路径,它和 shell 环境变量 PATH 差不多这个变量可以使用 python 脚本在运行时修改它
- 默认的 python 安装包的路径
想要看下你的电脑当前 sys.path 有哪些路径吗?运行下面代码就可以
import sys print(sys.path)
查找模块的顺序是从前向后,只要查到就使用,因此这个变量存储路径的顺序很重要。
模块中包含执行语句的情况
如果引入的模块中包含一些执行语句,那么在导入模块时这些语句就会执行。但是即使同样的模块被导入了两次,这些语句也只能执行一次。
来看下面的例子, 定义 calc 模块
print('I am clac module') def plus(a, b): return a + b def subtract(a, b): return a - b
并且在 main.py 中定义导入两次 calc 模块的函数
from calc import plus from calc import subtract print(plus(1, 2)) print(subtract(1, 2))
结果是 'I am clac module' 只会被打印一次。
用 dir() 函数来窥探模块
dir() 函数是 python 的内置函数,可用来获取模块的属性,方法等信息,当我们刚接触一个模块,不清楚它由哪些有用的属性和方法时,就可以用 dir() 来一探究竟。
以常用的 json模块 为例,我们来展示下它的属性和方法
import json print(dir(json)) # ['JSONDecodeError', 'JSONDecoder', 'JSONEncoder', '__all__', '__author__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', '__version__', '_default_decoder', '_default_encoder', 'codecs', 'decoder', 'detect_encoding', 'dump', 'dumps', 'encoder', 'load', 'loads', 'scanner']
其中以双下划线开头的变量,如 __name__ 并非是模块自己定义的,而是与模块相关的默认属性。
如果我想查看当前模块内的所有属性和方法呢?去掉 dir() 函数的参数就可以。拿上节的代码为例来看下。
from calc import plus from calc import subtract print(plus(1, 2)) print(subtract(1, 2)) print(dir()) # ['__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'plus', 'subtract']
我们会看到 calc 模块的 plus 和 substract 方法也展示了出来,那么 dir 函数究竟是从哪里获取的数据,背后的机理是什么呢?
其实每个模块内部都有一个子集的私有符号表,它就是模块内所有函数和方法共享的全局符号表。当模块 B 导入模块 A 时,就会把要导入的模块 A 或者特定的方法,属性放置到模块 B 的全局符号表中,dir() 函数也就是从模块中的全局符号表中获取出的值。
python 的内置模块有哪些?
python 的内置模块太丰富了,几乎可以满足我们日常的任何需求。既然有轮子就在那里,而且这轮子又快又好,又何必再造轮子呢?快来看下它的常用内置模块有哪些。
模块名功能简述calendar与日期相关datetime处理日期和时间csv读写 csv 文件json读写 json 格式数据collections提供有用的数据结构io处理 I/O 流os基本的操作系统函数访问shutil高级文件处理tempfile创建临时文件和目录logging日志功能random生成伪随机数copy复制数据相关codec编解码re正则表达式uuid全局唯一标识符 (UUID)multiprocessing运行多个子进程threading线程concurrent异步argparse解析命令行参数atexit注册在程序退出时调用的函数signal处理 POSIX 信号
光常用的模块就这么一大堆,确实是很难都记住,记不住也没关系,当需要用到的时候随用随查就可以了。
结语
本篇中主要介绍了模块化的定义,引入模块化的方式,模块的查找顺序,常用的内置模块简介等内容,通过使用模块化,能够更好的实践模块化程序设计的思想。但本篇并没有涉及 package 的概念,会在后续章节讲述。另外如果你也在学python,喜欢的朋友可以给个关注,私信‘01’获取学习资料哦
相关推荐
- Alist 玩家请进:一键部署全新分支 Openlist,看看香不香!
-
Openlist(其前身是鼎鼎大名的Alist)是一款功能强大的开源文件列表程序。它能像“万能钥匙”一样,解锁并聚合你散落在各处的云盘资源——无论是阿里云盘、百度网盘、GoogleDrive还是...
- 白嫖SSL证书还自动续签?这个开源工具让我告别手动部署
-
你还在手动部署SSL证书?你是不是也遇到过这些问题:每3个月续一次Let'sEncrypt证书,忘了就翻车;手动配置Nginx,重启服务,搞一次SSL得花一下午;付费证书太贵,...
- Docker Compose:让多容器应用一键起飞
-
CDockerCompose:让多容器应用一键起飞"曾经我也是一个手动启动容器的少年,直到我的膝盖中了一箭。"——某位忘记--link参数的运维工程师引言:容器化的烦恼与...
- 申请免费的SSL证书,到期一键续签
-
大家好,我是小悟。最近帮朋友配置网站HTTPS时发现,还有人对宝塔面板的SSL证书功能还不太熟悉。其实宝塔早就内置了免费的Let'sEncrypt证书申请和一键续签功能,操作简单到连新手都能...
- 飞牛NAS部署TVGate Docker项目,实现内网一键转发、代理、jx
-
前面分享了两期TVGate:Q大的转发代理工具TVGate升级了,操作更便捷,增加了新的功能跨平台内网转发神器TVGate部署与使用初体验现在项目已经开源,并支持Docker部署,本文介绍如何通...
- Docker Compose 编排实战:一键部署多容器应用!
-
当项目变得越来越复杂,一个服务已经无法满足需求时,你可能需要同时部署数据库、后端服务、前端网页、缓存组件……这时,如果还一个一个手动dockerrun,简直是灾难这就是DockerCompo...
- 深度测评:Vue、React 一键部署的神器 PinMe
-
不知道大家有没有这种崩溃瞬间:领导突然要看项目Demo,客户临时要体验新功能,自己写的小案例想发朋友圈;找运维?排期?还要走工单;自己买服务器?域名、SSL、Nginx、防火墙;本地起服务?断电、关...
- 超简单!一键启动多容器,解锁 Docker Compose 极速编排秘籍
-
想要用最简单的方式在本地复刻一套完整的微服务环境?只需一个docker-compose.yml文件,你就能一键拉起N个容器,自动组网、挂载存储、环境隔离,全程无痛!下面这份终极指南,教你如何用...
- 日志文件转运工具Filebeat笔记_日志转发工具
-
一、概述与简介Filebeat是一个日志文件转运工具,在服务器上以轻量级代理的形式安装客户端后,Filebeat会监控日志目录或者指定的日志文件,追踪读取这些文件(追踪文件的变化,不停的读),并将来自...
- K8s 日志高效查看神器,提升运维效率10倍!
-
通常情况下,在部署了K8S服务之后,为了更好地监控服务的运行情况,都会接入对应的日志系统来进行检测和分析,比如常见的Filebeat+ElasticSearch+Kibana这一套组合...
- 如何给网站添加 https_如何给网站添加证书
-
一、简介相信大家都知道https是更加安全的,特别是一些网站,有https的网站更能够让用户信任访问接下来以我的个人网站五岁小孩为例子,带大家一起从0到1配置网站https本次配置的...
- 10个Linux文件内容查看命令的实用示例
-
Linux文件内容查看命令30个实用示例详细介绍了10个Linux文件内容查看命令的30个实用示例,涵盖了从基本文本查看、分页浏览到二进制文件分析的各个方面。掌握这些命令帮助您:高效查看各种文本文件内...
- 第13章 工程化实践_第13章 工程化实践课
-
13.1ESLint+Prettier代码规范统一代码风格配置//.eslintrc.jsmodule.exports={root:true,env:{node...
- 龙建股份:工程项目中标_龙建股份有限公司招聘网
-
404NotFoundnginx/1.6.1【公告简述】2016年9月8日公告,公司于2016年9月6日收到苏丹共和国(简称“北苏丹”)喀土穆州基础设施与运输部公路、桥梁和排水公司出具的中标通知书...
- 福田汽车:获得政府补助_福田 补贴
-
404NotFoundnginx/1.6.1【公告简述】2016年9月1日公告,自2016年8月17日至今,公司共收到产业发展补助、支持资金等与收益相关的政府补助4笔,共计5429.08万元(不含...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)