美文网首页
五、python的模块

五、python的模块

作者: 井上皓 | 来源:发表于2018-10-02 04:58 被阅读0次

1.模块


在Python中,一个.py文件就称之为一个模块(Module)。

为了避免模块名冲突,Python又引入了按目录来组织模块的方法,称为包(Package)

方法是选择一个顶层包名,比如mycompany,按照如下目录存放:

目录存放

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

每一个包目录下面都必须有一个__init__.py的文件,否则,Python就把这个目录当成普通目录,而不是一个包。

组成多级层次的包结构

多级层次

上图可以理解为一个包含mycompany.web模块的模块

注意:自己创建模块时要注意命名,不能和Python自带的模块名称冲突。例如,系统自带了sys模块,自己的模块就不可命名为sys.py,否则将无法导入系统自带的sys模块。

a.使用模块


在文件内引入模块 结果

1.在代码开头,除了注释外的第一个字符串都是文档注释。

2.__author__变量用来储存作者名字

3.import sys为导入sys模块

4.sys模块有一个argv变量,用list存储了命令行的所有参数。

例如

运行python3 hello.py获得的sys.argv就是['hello.py'];

运行python3 hello.py Michael获得的sys.argv就是['hello.py', 'Michael]。

b.安装第三方模块


安装第三方模块,是通过包管理工具pip完成的。

在命令提示符窗口下尝试运行pip来检查是否安装pip

第一种方法

一般来说,第三方库都会在Python官方的pypi.python.org网站注册,要安装一个第三方库,必须先知道该库的名称,可以在官网或者pypi上搜索,比如Pillow的名称叫Pillow,因此,安装Pillow的命令就是:

pip install Pillow

第二种方法

使用Anaconda,这是一个基于Python的数据处理和科学计算平台,它已经内置了许多非常有用的第三方库,我们装上Anaconda,就相当于把数十个第三方模块自动安装好了,非常简单易用。

国内镜像

c.模块搜索路径


加载一个模块时,Python会在指定的路径下搜索对应的.py文件,如果找不到,就会报错。

默认情况下,Python解释器会搜索当前目录、所有已安装的内置模块和第三方模块,搜索路径存放在sys模块的path变量中:

path变量

如果我们要添加自己的搜索目录,有两种方法:

一是直接修改sys.path,添加要搜索的目录:

sys.path.append('路径信息')

第二种方法是设置环境变量PYTHONPATH,该环境变量的内容会被自动添加到模块搜索路径中。

2.常用内建模块


内置的模块即是内建模块

a、collections


namedtuple

namedtuple是一个函数,它用来创建一个自定义的tuple对象,并且规定了tuple元素的个数,并可以用属性而不是索引来引用tuple的某个元素。

namedtuple

deque

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

deque

defaultdict

使用dict时,如果引用Key不存在而又不希望报错,那就可以使用defaultdict返回一个默认值。

defaultdict

defaultdict和dict除了默认值外是完全一样的。

OrderedDict

dict中的Key是无序的

OrderedDict可以保持Key的顺序

OrderedDict的Key会按照插入的顺序排列

并且当容量超出限制时,先删除最早添加的Key

OrderedDict

Counter

Counter是计数器

Counter也是dict的一个子类

Counter

b、base64


Base64是一种最常见的二进制编码方法

python内置的base64可以直接进行base64的编解码

因为python中字符都为unicode编码,而b64encode函数的参数为byte类型,所以必须先转码。

b 表示 byte的意思,想要去掉b'',只要将byte转换回去就可以。

c、struct


Python没有专门处理字节的数据类型。但由于b'str'可以表示字节,所以,字节数组=二进制str。

如果把一个八位无符号整数变成字节如下:

整数变成字节

由此可见,数要是越来越大,转换就越来越麻烦。

所以就引入了struct

struct模块来解决bytes和其他二进制数据类型的转换

pack()

pack函数把任意数据类型变成bytes

pack()

第一个参数'>I'中,>表示字节顺序是网络序,I表示4字节无符号整数。

后面的参数个数要和处理指令一致。

unpack()

unpack把bytes变成相应的数据类型

unpack()

根据>IH的说明,后面的bytes依次变为I:4字节无符号整数和H:2字节无符号整数。

d、hashlib


摘要算法通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。

目的是为了发现原始数据是否被人篡改过。

因为其函数的复杂性,所以很难进行反推。

摘要算法MD5

摘要算法MD5

使用update()可以分块多次调用

摘要算法SHA1

与上一个算法基本一致

摘要算法SHA1

使用update()可以分块多次调用

e、hmac


因为通过彩虹表根据哈希值反推原始口令,所以需要增加一个salt来使得相同的输入也能得到不同的哈希值。

Python自带的hmac模块实现了标准的Hmac算法。

使用hmac实现带key的哈希

message:信息,

key:自己设定

注意:传入的key和message都是bytes类型,不是的话需要先转换为bytes。

f.itertools


itertools提供了用于操作迭代对象的函数

“无限”迭代器

count()

count()会创建一个无限的迭代器

count()

按Ctrl+C退出

cycle()

cycle()会把传入的一个序列无限重复下去

cycle()

按Ctrl+C退出

repeat()

repeat()负责把一个元素无限重复下去,第二个参数就可以限定重复次数.

repeat()

(只重复了三次)

迭代器操作函数

无限序列只有在for迭代时才会无限地迭代下去,如果只是创建了一个迭代对象,它不会事先把无限个元素生成出来,事实上也不可能在内存中创建无限多个元素。

无限序列虽然可以无限迭代下去,但是通常我们会通过takewhile()等函数根据条件判断来截取出一个有限的序列:

takewhile()

takewhile()

itertools提供迭代器操作函数

chain()

chain()可以把一组迭代对象串联起来,形成一个更大的迭代器。

chain()

groupby()

groupby()把迭代器中相邻的重复元素挑出来放在一起

groupby()

g、contextlib


读写文件必须注意关闭问题,否则占内存。

一个方法是使用try...finally

另一个就是with语句

with语句

with语句会自动调用close()方法关闭文件。

with语句

with

with语句并不是只适用于open()

任何对象,只要正确实现了上下文管理,就可以用于with语句。

资源对象用于with语句   结果

contextlib提供了比编写__enter__和__exit__更简单的写法

@contextmanager

@contextmanager 结果

@contextmanager这个decorator接受一个generator,用yield语句把with ... as var把变量输出出去,然后,with语句就可以正常地工作了

@contextmanager另一个作用是,如果某段代码执行前后自动执行特定代码,即可使用@contextmanager实现。

@contextmanager 结果

执行顺序是:

with语句首先执行yield之前的语句,因此打印出<h1>;

yield调用会执行with语句内部的所有语句,因此打印出hello和world;

最后执行yield之后的语句,打印出</h1>。

@contextmanager通过编写generator来做简化

@closing

with语句只能用于一个对象实现上下文的代码

closing()可以把一个对象变为上下文对象

h、urllib


urllib提供了一系列用于操作URL的功能

Get

request模块可以抓取URL内容

相关文章

网友评论

      本文标题:五、python的模块

      本文链接:https://www.haomeiwen.com/subject/qdpvnftx.html