五、python的模块

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内容

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容

  • 正文如下: 模块 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护。...
    OzanShareing阅读 312评论 0 1
  • 一、模块介绍 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护。 为...
    祐吢房_2c9a阅读 342评论 1 1
  • 模块 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护。 为了编写可...
    蓓蓓的万能男友阅读 232评论 0 0
  • 新经济”于2016年首次被写进政府工作报告中,成为指导我国经济发展的大政方针。新经济是信息化带来的经济文化成果,具...
    职场信息资讯阅读 407评论 0 0
  • 前不久看完了黄渤导演《一出好戏》,作为处女作,可以说很用心了,魔幻现实主义题材,在院线很少见,故事主题偏小众,没有...
    知鱼君阅读 196评论 0 0