1.模块
在Python中,一个.py文件就称之为一个模块(Module)。
包
为了避免模块名冲突,Python又引入了按目录来组织模块的方法,称为包(Package)。
方法是选择一个顶层包名,比如mycompany,按照如下目录存放:
![](https://img.haomeiwen.com/i14030079/3d2a2dffde0bc64a.png)
引入了包以后,只要顶层的包名不与别人冲突,那所有模块都不会与别人冲突。现在,abc.py模块的名字就变成了mycompany.abc,类似的,xyz.py的模块名变成了mycompany.xyz。
每一个包目录下面都必须有一个__init__.py的文件,否则,Python就把这个目录当成普通目录,而不是一个包。
组成多级层次的包结构
![](https://img.haomeiwen.com/i14030079/695c0b92da6ebef2.png)
上图可以理解为一个包含mycompany.web模块的模块
注意:自己创建模块时要注意命名,不能和Python自带的模块名称冲突。例如,系统自带了sys模块,自己的模块就不可命名为sys.py,否则将无法导入系统自带的sys模块。
a.使用模块
![](https://img.haomeiwen.com/i14030079/875ef01c2116c7f0.png)
![](https://img.haomeiwen.com/i14030079/b1ebcb7c0874b83f.png)
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变量中:
![](https://img.haomeiwen.com/i14030079/9c4007d8f6ecfae1.png)
如果我们要添加自己的搜索目录,有两种方法:
一是直接修改sys.path,添加要搜索的目录:
sys.path.append('路径信息')
第二种方法是设置环境变量PYTHONPATH,该环境变量的内容会被自动添加到模块搜索路径中。
2.常用内建模块
内置的模块即是内建模块
a、collections
namedtuple
namedtuple是一个函数,它用来创建一个自定义的tuple对象,并且规定了tuple元素的个数,并可以用属性而不是索引来引用tuple的某个元素。
![](https://img.haomeiwen.com/i14030079/edd28da8d3db7884.png)
deque
deque是为了高效实现插入和删除操作的双向列表,适合用于队列和栈。
![](https://img.haomeiwen.com/i14030079/fae3d472856746d8.png)
defaultdict
使用dict时,如果引用Key不存在而又不希望报错,那就可以使用defaultdict返回一个默认值。
![](https://img.haomeiwen.com/i14030079/a9b946be671011b0.png)
defaultdict和dict除了默认值外是完全一样的。
OrderedDict
dict中的Key是无序的
OrderedDict可以保持Key的顺序
OrderedDict的Key会按照插入的顺序排列
并且当容量超出限制时,先删除最早添加的Key
![](https://img.haomeiwen.com/i14030079/574f13216f00939c.png)
Counter
Counter是计数器
Counter也是dict的一个子类
![](https://img.haomeiwen.com/i14030079/8a176c1ccbeac584.png)
b、base64
Base64是一种最常见的二进制编码方法
python内置的base64可以直接进行base64的编解码
因为python中字符都为unicode编码,而b64encode函数的参数为byte类型,所以必须先转码。
![](https://img.haomeiwen.com/i14030079/219c8a795866c5a5.png)
b 表示 byte的意思,想要去掉b'',只要将byte转换回去就可以。
c、struct
Python没有专门处理字节的数据类型。但由于b'str'可以表示字节,所以,字节数组=二进制str。
如果把一个八位无符号整数变成字节如下:
![](https://img.haomeiwen.com/i14030079/3421e7ea4bccb8cc.png)
由此可见,数要是越来越大,转换就越来越麻烦。
所以就引入了struct
struct模块来解决bytes和其他二进制数据类型的转换
pack()
pack函数把任意数据类型变成bytes
![](https://img.haomeiwen.com/i14030079/e799df0fa07037b6.png)
第一个参数'>I'中,>表示字节顺序是网络序,I表示4字节无符号整数。
后面的参数个数要和处理指令一致。
unpack()
unpack把bytes变成相应的数据类型
![](https://img.haomeiwen.com/i14030079/da02d7f5966f7066.png)
根据>IH的说明,后面的bytes依次变为I:4字节无符号整数和H:2字节无符号整数。
d、hashlib
摘要算法通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。
目的是为了发现原始数据是否被人篡改过。
因为其函数的复杂性,所以很难进行反推。
摘要算法MD5
![](https://img.haomeiwen.com/i14030079/08e2e7d08c682277.png)
使用update()可以分块多次调用
摘要算法SHA1
与上一个算法基本一致
![](https://img.haomeiwen.com/i14030079/e615103cef466841.png)
使用update()可以分块多次调用
e、hmac
因为通过彩虹表根据哈希值反推原始口令,所以需要增加一个salt来使得相同的输入也能得到不同的哈希值。
Python自带的hmac模块实现了标准的Hmac算法。
![](https://img.haomeiwen.com/i14030079/eaf490ce3e4e4851.png)
message:信息,
key:自己设定
注意:传入的key和message都是bytes类型,不是的话需要先转换为bytes。
f.itertools
itertools提供了用于操作迭代对象的函数
“无限”迭代器
count()
count()会创建一个无限的迭代器
![](https://img.haomeiwen.com/i14030079/bb188353fb02b96d.png)
按Ctrl+C退出
cycle()
cycle()会把传入的一个序列无限重复下去
![](https://img.haomeiwen.com/i14030079/c6a9c6dd4124a3f1.png)
按Ctrl+C退出
repeat()
repeat()负责把一个元素无限重复下去,第二个参数就可以限定重复次数.
![](https://img.haomeiwen.com/i14030079/5e9b8ab11ceed817.png)
(只重复了三次)
迭代器操作函数
无限序列只有在for迭代时才会无限地迭代下去,如果只是创建了一个迭代对象,它不会事先把无限个元素生成出来,事实上也不可能在内存中创建无限多个元素。
无限序列虽然可以无限迭代下去,但是通常我们会通过takewhile()等函数根据条件判断来截取出一个有限的序列:
takewhile()
![](https://img.haomeiwen.com/i14030079/e1fbc4502e736491.png)
itertools提供迭代器操作函数
chain()
chain()可以把一组迭代对象串联起来,形成一个更大的迭代器。
![](https://img.haomeiwen.com/i14030079/f565f3d40f4372eb.png)
groupby()
groupby()把迭代器中相邻的重复元素挑出来放在一起
![](https://img.haomeiwen.com/i14030079/b24b232483e22ffe.png)
g、contextlib
读写文件必须注意关闭问题,否则占内存。
一个方法是使用try...finally
另一个就是with语句
with语句
with语句会自动调用close()方法关闭文件。
with语句
![](https://img.haomeiwen.com/i14030079/5b5922f630d51de4.png)
with语句并不是只适用于open()
任何对象,只要正确实现了上下文管理,就可以用于with语句。
![](https://img.haomeiwen.com/i14030079/8cfdae8b8932b095.png)
![](https://img.haomeiwen.com/i14030079/33f3f80fa51a8c27.png)
contextlib提供了比编写__enter__和__exit__更简单的写法
@contextmanager
![](https://img.haomeiwen.com/i14030079/612ecd7e594d93a0.png)
![](https://img.haomeiwen.com/i14030079/aa328870746edd8b.png)
@contextmanager这个decorator接受一个generator,用yield语句把with ... as var把变量输出出去,然后,with语句就可以正常地工作了
@contextmanager另一个作用是,如果某段代码执行前后自动执行特定代码,即可使用@contextmanager实现。
![](https://img.haomeiwen.com/i14030079/abfd7fc82ad41a57.png)
![](https://img.haomeiwen.com/i14030079/f725f40ecba5062f.png)
执行顺序是:
with语句首先执行yield之前的语句,因此打印出<h1>;
yield调用会执行with语句内部的所有语句,因此打印出hello和world;
最后执行yield之后的语句,打印出</h1>。
@contextmanager通过编写generator来做简化
@closing
with语句只能用于一个对象实现上下文的代码
closing()可以把一个对象变为上下文对象
h、urllib
urllib提供了一系列用于操作URL的功能
Get
request模块可以抓取URL内容
网友评论