码迷,mamicode.com
首页 > 编程语言 > 详细

Python模块总结

时间:2021-03-09 13:50:42      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:fun   练习   round   mic   isp   初始   报错   替换   使用   

<!doctype html>

Python模块总结

Python模块总结

一、Python模块定义与分类

1.1、定义

把一些常用的函数放在一个py文件中,这个文件就称之为模块,模块,就是一些列常用功能的集合体

1.2、为什么使用模块

1)通常将程序分成一个个的文件,这样做程序的结构更清晰,方便管理。这时我们不仅仅可以把这些文件当做脚本去执行,还可以把他们当做模块来导入到其他的模块中,实现了功能的重复利用

2)拿来主义,提升开发效率

1.3、模块分类

内置模块:也叫做标准库。此类模块就是python解释器给你提供的,比如我们之前见过的time模块,os模块。标准库的模块非常多(200多个,每个模块又有很多功能)

第三方模块:一些python大神写的非常好用的模块,必须通过pip install 指令安装的模块,比如BeautfulSoup, Django等。大概有6000多个

自定义模块:自己在项目中定义的一些模块

二、自定义模块

2.0、准备模块

2.1、import使用

当我引用abcd模块的时候,实际上将abcd.py执行一遍,加载到内存.

import语句是可以在程序中的任意位置使用的,且针对同一个模块很import多次,为了防止你重复导入,python的优化手段是:第一次导入后就将模块名加载到内存了,后续的import语句仅是对已经加载到内存中的模块对象增加了一次引用,不会重新执行模块内的语句

2.1.1、第一次导入模块执行三件事

1)创建一个以模块名命名的名称空间。

2)执行这个名称空间(即导入的模块)里面的代码。

3)通过此模块名. 的方式引用该模块里面的内容(变量,函数名,类名等)

ps:重复导入会直接引用内存中已经加载好的结果

2.1.2、被导入模块有独立的名称空间

每个模块都是一个独立的名称空间,定义在这个模块中的函数,把这个模块的名称空间当做全局名称空间,这样我们在编写自己的模块时,就不用担心我们定义在自己模块中全局变量会在被导入时,与使用者的全局变量冲突

2.1.3、模块起别名

1)可以将很长的模块名改成很短,方便使用

2)有利于代码的扩展和优化

2.1.4、导入多个模块

2.2、from ... import ...

2.2.1、from ... import ... 使用

2.2.2、from...import... 与import对比

使用from...import...则是将模块中的名字直接导入到当前的名称空间中,所以在当前名称空间中,直接使用名字就可以了、无需加前缀

好处:使用方便

缺点:执行文件有与模块同名的变量或者函数名,会有覆盖效果

2.2.3、一行导入多个

2.2.4、from ... import *

from 模块 import * :把模块中所有的不是以下划线(_)开头的名字都导入到当前位置,不推荐使用这种导入方式

三、内置模块

3.1、序列化模块

序列化:将一个常见的数据结构转化成一个特殊的序列,并且这个特殊的序列还可以反解回去。

主要用途:文件读写数据,网络传输数据

3.1.1、json模块

json序列化只支持部分Python数据结构:dict,list, tuple,str,int, float,True,False,None

json模块是将满足条件的数据结构转化成特殊的字符串,并且也可以反序列化还原回去。

json主要有两对4个方法:

  • 用于网络传输:dumps、loads
  • 用于文件写读:dump、load

1)dumps、loads

特殊参数:

需求:将字典写入文件并读出

2)dump、load

单个数据的存取文件

3.1.2、pickle模块

pickle模块是将Python所有的数据结构以及对象等转化成bytes类型,然后还可以反序列化还原回去

使用上与json几乎差不多,也是两对四个方法:

  • 用于网络传输:dumps、loads
  • 用于文件写读:dump、load

1)dumps、loads

2)dump、load

3.2、os模块

注意:os.stat(‘path/filename‘) 获取文件/目录信息 的结构说明

3.3、sys模块

3.4、hashlib模块

此模块称为摘要算法,也叫做加密算法,或者是哈希算法,散列算法

通过一个函数,把任意长度的数据按照一定规则转换为一个固定长度的数据串(通常用16进制的字符串表示),用于加密解密

hashlib的特征:

  1. bytes类型数据==>通过hashlib算法==>固定长度的字符串
  2. 不同的bytes类型数据转化成的结果一定不同。
  3. 相同的bytes类型数据转化成的结果一定相同。
  4. 此转化过程不可逆。

hashlib主要用途:

  • 密码加密
  • 文件一致性校验

3.4.1、密码加密

3.4.2、固定盐加密

3.4.3、动态盐加密

3.4.4、其他加密算法

对安全要求比较高的企业,比如金融行业,MD5加密的方式就不够了,得需要加密方式更高的,比如sha系列,sha1,sha224,sha512等等,数字越大,加密的方法越复杂,安全性越高,但是效率就会越慢

3.4.5、文件一致性校验

md5计算的就是bytes类型的数据的转换值,同一个bytes数据用同样的加密方式转化成的结果一定相同,如果不同的bytes数据(即使一个数据只是删除了一个空格)那么用同样的加密方式转化成的结果一定是不同的。所以,hashlib也是验证文件一致性的重要工具

3.5、time模块

表示时间的三种方式

1)时间戳(timestamp) :通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量

2)格式化的时间字符串(Format String): ‘1999-12-06‘

3)元组(struct_time) :struct_time元组共有9个元素共九个元素:(年,月,日,时,分,秒,一年中第几周,一年中第几天等)

技术图片

几种格式之间的转换

技术图片

3.6、datatime模块

3.7、random模块

需求:生成随机验证码

3.8、logging模块

默认情况下Python的logging模块将日志打印到了标准输出中,且只显示了大于等于WARNING级别的日志,这说明默认的日志级别设置为WARNING

日志级别等级:CRITICAL > ERROR > WARNING > INFO > DEBUG

1)第一版日志配置

参数说明

缺点: 文件与屏幕输入只能选择一个

2)第二版日志配置:对象方式

logging库提供了多个组件:Logger、Handler、Filter、Formatter

  • Logger对象:提供应用程序可直接使用的接口
  • Handler:发送日志到适当的目的地
  • Filter:提供了过滤日志信息的方法
  • Formatter:指定日志显示格式。

可以通过:logger.setLevel(logging.Debug)设置级别,当然,也可以通过fh.setLevel(logging.Debug)单对文件流设置某个级别

3)第三版日志配置:通过配置文件方式

3.9、collections模块

在内置数据类型(dict、list、set、tuple)的基础上,collections模块还提供了几个额外的数据类型:Counter、deque、defaultdict、namedtuple和OrderedDict等

  • namedtuple: 生成可以使用名字来访问元素内容的tuple
  • deque: 双端队列,可以快速的从另外一侧追加和推出对象
  • Counter: 计数器,主要用来计数
  • OrderedDict: 有序字典
  • defaultdict: 带有默认值的字典

3.9.1、namedtuple:命名元祖

3.9.2、deque:双端队列

使用list存储数据时,按索引访问元素很快,但是插入和删除元素就很慢了,因为list是线性存储,数据量大的时候,插入和删除效率很低

deque是为了高效实现插入和删除操作的双向列表,适合用于队列和栈

3.9.3、OrderedDict:有序字典

注意,OrderedDict的Key会按照插入的顺序排列,不是Key本身排序

3.9.4、defaultdict:默认字典

使用dict时,如果引用的Key不存在,就会抛出KeyError。如果希望key不存在时,返回一个默认值,就可以用defaultdict

3.9.5、counter:计数器

3.10、re模块

正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法

元字符 匹配内容
\w匹配字母(包含中文)或数字或下划线
\W匹配非字母(包含中文)或数字或下划线
\s匹配任意的空白符
\S匹配任意非空白符
\d匹配数字
\Dp匹配非数字
\A从字符串开头匹配
\z匹配字符串的结束,如果是换行,只匹配到换行前的结果
\n匹配一个换行符
\t匹配一个制表符
^匹配字符串的开始
$匹配字符串的结尾
.匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符。
[...]匹配字符组中的字符
[^...]匹配除了字符组中的字符的所有字符
*匹配0个或者多个左边的字符。
+匹配一个或者多个左边的字符。
匹配0个或者1个左边的字符,非贪婪方式。
{n}精准匹配n个前面的表达式。
{n,m}匹配n到m次由前面的正则表达式定义的片段,贪婪方式
a|b匹配a或者b。
()匹配括号内的表达式,也表示一个组

3.10.1、匹配模式举例

3.10.2、常用方法举例

3.10.3、命名分组举例

3.10.4、正则匹配练习

四、第三方模块

五、模块其他说明

5.1、py文件的功能

一个python文件可以有两种用途:

  • 脚本:一个文件就是整个程序,用来被执行
  • 模块:文件中存放着一堆功能,用来被导入使用

python为我们内置了全局变量__name__

  • 当文件被当做脚本执行时:__name__ 等于__main__
  • 当文件被当做模块导入时:__name__等于模块名

作用:用来控制.py文件在不同的应用场景下执行不同的逻辑(或者是在模块文件中测试代码)

5.2、模块的搜索路径

顺序:内存 ----> 内置模块 ---> sys.path

模块的查找顺序

  1. 在第一次导入某个模块时,会先检查该模块是否已经被加载到内存中(当前执行文件的名称空间对应的内存),如果有则直接引用(ps:python解释器在启动时会自动加载一些模块到内存中,可以使用sys.modules查看)
  2. 如果没有,解释器则会查找同名的内置模块
  3. 如果还没有找到就从sys.path给出的目录列表中依次寻找文件。

六、包

包就是一个包含有__init__.py文件的文件夹,所以其实我们创建包的目的就是为了用文件夹将文件/模块组织起来

需要强调的是:

  1. 在python3中,即使包下没有__init__.py文件,import 包仍然不会报错,而在python2中,包下一定要有该文件,否则import 包报错
  2. 创建包的目的不是为了运行,而是被导入使用,包只是模块的一种形式而已,包的本质就是一种模块

创建一个包,也会发生三件事:

6.1、执行文件直接import

技术图片

1)执行文件如何引用aaa包中__init__.py中的变量和方法

因为执行文件和aaa包在同一级下,直接import aaa就可以将aaa包__init__.py中的变量和方法引入

2)执行文件如何引入aaa包中m1文件中的变量和方法

3)执行文件如何引入aaa包中bbb包中__init__.py文件中的变量和方法

4)执行文件如何引入aaa包中bbb包中mb.py文件中的变量和方法

6.2、执行文件from ... import...

通过这种方式不用设置__init__.py文件

技术图片

1)执行文件如何引入aaa包中m1中的变量和方法

2)执行文件如何引入aaa包中bbb包中m2.py中的变量和方法

6.3、绝对导入和相对导入

绝对导入:以顶级包作为起始

相对导入:用.或者..的方式最为起始(只能在一个包中使用,不能用于不同目录内)

技术图片

1)执行文件中使用相对引入导入nb包m1,m2,m3中的函数

 

Python模块总结

标签:fun   练习   round   mic   isp   初始   报错   替换   使用   

原文地址:https://www.cnblogs.com/hujinzhong/p/14504092.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!