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变量中:
如果我们要添加自己的搜索目录,有两种方法:
一是直接修改sys.path,添加要搜索的目录:
sys.path.append('路径信息')
第二种方法是设置环境变量PYTHONPATH,该环境变量的内容会被自动添加到模块搜索路径中。
2.常用内建模块
内置的模块即是内建模块
a、collections
namedtuple
namedtuple是一个函数,它用来创建一个自定义的tuple对象,并且规定了tuple元素的个数,并可以用属性而不是索引来引用tuple的某个元素。
deque
deque是为了高效实现插入和删除操作的双向列表,适合用于队列和栈。
defaultdict
使用dict时,如果引用Key不存在而又不希望报错,那就可以使用defaultdict返回一个默认值。
defaultdict和dict除了默认值外是完全一样的。
OrderedDict
dict中的Key是无序的
OrderedDict可以保持Key的顺序
OrderedDict的Key会按照插入的顺序排列
并且当容量超出限制时,先删除最早添加的Key
Counter
Counter是计数器
Counter也是dict的一个子类
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
第一个参数'>I'中,>表示字节顺序是网络序,I表示4字节无符号整数。
后面的参数个数要和处理指令一致。
unpack()
unpack把bytes变成相应的数据类型
根据>IH的说明,后面的bytes依次变为I:4字节无符号整数和H:2字节无符号整数。
d、hashlib
摘要算法通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。
目的是为了发现原始数据是否被人篡改过。
因为其函数的复杂性,所以很难进行反推。
摘要算法MD5
使用update()可以分块多次调用
摘要算法SHA1
与上一个算法基本一致
使用update()可以分块多次调用
e、hmac
因为通过彩虹表根据哈希值反推原始口令,所以需要增加一个salt来使得相同的输入也能得到不同的哈希值。
Python自带的hmac模块实现了标准的Hmac算法。
message:信息,
key:自己设定
注意:传入的key和message都是bytes类型,不是的话需要先转换为bytes。
f.itertools
itertools提供了用于操作迭代对象的函数
“无限”迭代器
count()
count()会创建一个无限的迭代器
按Ctrl+C退出
cycle()
cycle()会把传入的一个序列无限重复下去
按Ctrl+C退出
repeat()
repeat()负责把一个元素无限重复下去,第二个参数就可以限定重复次数.
(只重复了三次)
迭代器操作函数
无限序列只有在for迭代时才会无限地迭代下去,如果只是创建了一个迭代对象,它不会事先把无限个元素生成出来,事实上也不可能在内存中创建无限多个元素。
无限序列虽然可以无限迭代下去,但是通常我们会通过takewhile()等函数根据条件判断来截取出一个有限的序列:
takewhile()
itertools提供迭代器操作函数
chain()
chain()可以把一组迭代对象串联起来,形成一个更大的迭代器。
groupby()
groupby()把迭代器中相邻的重复元素挑出来放在一起
g、contextlib
读写文件必须注意关闭问题,否则占内存。
一个方法是使用try...finally
另一个就是with语句
with语句
with语句会自动调用close()方法关闭文件。
with语句
with语句并不是只适用于open()
任何对象,只要正确实现了上下文管理,就可以用于with语句。
contextlib提供了比编写__enter__和__exit__更简单的写法
@contextmanager
@contextmanager这个decorator接受一个generator,用yield语句把with ... as var把变量输出出去,然后,with语句就可以正常地工作了
@contextmanager另一个作用是,如果某段代码执行前后自动执行特定代码,即可使用@contextmanager实现。
执行顺序是:
with语句首先执行yield之前的语句,因此打印出<h1>;
yield调用会执行with语句内部的所有语句,因此打印出hello和world;
最后执行yield之后的语句,打印出</h1>。
@contextmanager通过编写generator来做简化
@closing
with语句只能用于一个对象实现上下文的代码
closing()可以把一个对象变为上下文对象
h、urllib
urllib提供了一系列用于操作URL的功能
Get
request模块可以抓取URL内容