Python学习目录html
Python之因此自称“batteries included”,就是由于内置了许多很是有用的模块,无需额外安装和配置,便可直接使用。python
datetime是Python处理日期和时间的标准库。git
>>> from datetime import datetime
>>> dt = datetime(2015, 4, 19, 12, 20) # 用指定日期时间建立datetime
>>> dt.timestamp() # 把datetime转换为timestamp
1429417200.0
复制代码
注意Python的timestamp是一个浮点数。若是有小数位,小数位表示毫秒数。github
collections是Python内建的一个集合模块,提供了许多有用的集合类。算法
>>> from collections import namedtuple
>>> Point = namedtuple('Point', ['x', 'y'])
>>> p = Point(1, 2)
>>> p.x
1
>>> p.y
2
复制代码
namedtuple
是一个函数,它用来建立一个自定义的tuple
对象,而且规定了tuple
元素的个数,并能够用属性而不是索引来引用tuple
的某个元素。编程
这样一来,咱们用namedtuple
能够很方便地定义一种数据类型,它具有tuple的不变性,又能够根据属性来引用,使用十分方便。json
使用list
存储数据时,按索引访问元素很快,可是插入和删除元素就很慢了,由于list
是线性存储,数据量大的时候,插入和删除效率很低。api
deque是为了高效实现插入和删除操做的双向列表,适合用于队列和栈:bash
>>> from collections import deque
>>> q = deque(['a', 'b', 'c'])
>>> q.append('x')
>>> q.appendleft('y')
>>> q
deque(['y', 'a', 'b', 'c', 'x'])
复制代码
deque
除了实现list的append()
和pop()
外,还支持appendleft()
和popleft()
,这样就能够很是高效地往头部添加或删除元素。cookie
>>> from collections import defaultdict
>>> dd = defaultdict(lambda: 'N/A')
>>> dd['key1'] = 'abc'
>>> dd['key1'] # key1存在
'abc'
>>> dd['key2'] # key2不存在,返回默认值
'N/A'
复制代码
注意默认值是调用函数返回的,而函数在建立defaultdict
对象时传入。
除了在Key不存在时返回默认值,defaultdict
的其余行为跟dict
是彻底同样的。
使用dict
时,Key是无序的。在对dict
作迭代时,咱们没法肯定Key的顺序。
若是要保持Key的顺序,能够用OrderedDict
:
>>> from collections import OrderedDict
>>> d = dict([('a', 1), ('b', 2), ('c', 3)])
>>> d # dict的Key是无序的
{'a': 1, 'c': 3, 'b': 2}
>>> od = OrderedDict([('a', 1), ('b', 2), ('c', 3)])
>>> od # OrderedDict的Key是有序的
OrderedDict([('a', 1), ('b', 2), ('c', 3)])
复制代码
注意,OrderedDict
的Key会按照插入的顺序排列,不是Key自己排序:
>>> od = OrderedDict()
>>> od['z'] = 1
>>> od['y'] = 2
>>> od['x'] = 3
>>> list(od.keys()) # 按照插入的Key的顺序返回
['z', 'y', 'x']
复制代码
OrderedDict
能够实现一个FIFO(先进先出)的dict,当容量超出限制时,先删除最先添加的Key:
from collections import OrderedDict
class LastUpdatedOrderedDict(OrderedDict):
def __init__(self, capacity):
super(LastUpdatedOrderedDict, self).__init__()
self._capacity = capacity
def __setitem__(self, key, value):
containsKey = 1 if key in self else 0
if len(self) - containsKey >= self._capacity:
last = self.popitem(last=False)
print('remove:', last)
if containsKey:
del self[key]
print('set:', (key, value))
else:
print('add:', (key, value))
OrderedDict.__setitem__(self, key, value)
复制代码
Counter
是一个简单的计数器,例如,统计字符出现的个数:
>>> from collections import Counter
>>> c = Counter()
>>> for ch in 'programming':
... c[ch] = c[ch] + 1
...
>>> c
Counter({'g': 2, 'm': 2, 'r': 2, 'a': 1, 'i': 1, 'o': 1, 'n': 1, 'p': 1})
复制代码
Counter
实际上也是dict
的一个子类,上面的结果能够看出,字符'g'
、'm'
、'r'
各出现了两次,其余字符各出现了一次。
Base64是一种用64个字符来表示任意二进制数据的方法。
Base64编码会把3字节的二进制数据编码为4字节的文本数据,长度增长33%,好处是编码后的文本数据能够在邮件正文、网页等直接显示。
若是要编码的二进制数据不是3的倍数,最后会剩下1个或2个字节怎么办?Base64用\x00
字节在末尾补足后,再在编码的末尾加上1个或2个=
号,表示补了多少字节,解码的时候,会自动去掉。
>>> import base64
>>> base64.b64encode(b'binary\x00string')
b'YmluYXJ5AHN0cmluZw=='
>>> base64.b64decode(b'YmluYXJ5AHN0cmluZw==')
b'binary\x00string'
复制代码
struct
模块来解决bytes
和其余二进制数据类型的转换,struct
的pack
函数把任意数据类型变成bytes
:
>>> import struct
>>> struct.pack('>I', 10240099)
b'\x00\x9c@c'
复制代码
pack
的第一个参数是处理指令,'>I'
的意思是:
>
表示字节顺序是big-endian,也就是网络序,I
表示4字节无符号整数。'
Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等。
咱们以常见的摘要算法MD5为例,计算出一个字符串的MD5值:
import hashlib
md5 = hashlib.md5()
md5.update('how to use md5 in python hashlib?'.encode('utf-8'))
print(md5.hexdigest())
复制代码
计算结果以下:
d26a53750bc40b38b65a520292f69306
复制代码
还有不少内建模块也常使用,如:hmac,itertools,contextlib,urllib,XML,HTMLParser
除了内建的模块外,Python还有大量的第三方模块。
基本上,全部的第三方模块都会在PyPI - the Python Package Index上注册,只要找到对应的模块名字,便可用pip安装。
此外,在安装第三方模块一节中,咱们强烈推荐安装Anaconda,安装后,数十个经常使用的第三方模块就已经就绪,不用pip手动安装。
PIL:Python Imaging Library,已是Python平台事实上的图像处理标准库了。PIL功能很是强大,但API却很是简单易用。
因为PIL仅支持到Python 2.7,加上年久失修,因而一群志愿者在PIL的基础上建立了兼容的版本,名字叫Pillow,支持最新Python 3.x,又加入了许多新特性,所以,咱们能够直接安装使用Pillow。
若是安装了Anaconda,Pillow就已经可用了。不然,须要在命令行下经过pip安装:
$ pip install pillow
复制代码
若是遇到Permission denied
安装失败,请加上sudo
重试。
来看看最多见的图像缩放操做,只需三四行代码:
from PIL import Image
# 打开一个jpg图像文件,注意是当前路径:
im = Image.open('test.jpg')
# 得到图像尺寸:
w, h = im.size
print('Original image size: %sx%s' % (w, h))
# 缩放到50%:
im.thumbnail((w//2, h//2))
print('Resize image to: %sx%s' % (w//2, h//2))
# 把缩放后的图像用jpeg格式保存:
im.save('thumbnail.jpg', 'jpeg')
复制代码
其余功能如切片、旋转、滤镜、输出文字、调色板等包罗万象。
好比,模糊效果也只需几行代码:
from PIL import Image, ImageFilter
# 打开一个jpg图像文件,注意是当前路径:
im = Image.open('test.jpg')
# 应用模糊滤镜:
im2 = im.filter(ImageFilter.BLUR)
im2.save('blur.jpg', 'jpeg')
复制代码
用于访问网络资源。
若是安装了Anaconda,requests就已经可用了。不然,须要在命令行下经过pip安装:
$ pip install requests
复制代码
若是遇到Permission denied安装失败,请加上sudo重试。
要经过GET访问一个页面,只须要几行代码:
>>> import requests
>>> r = requests.get('https://www.douban.com/') # 豆瓣首页
>>> r.status_code
200
>>> r.text
r.text
'<!DOCTYPE HTML>\n<html>\n<head>\n<meta name="description" content="提供图书、电影、音乐唱片的推荐、评论和...'
复制代码
对于带参数的URL,传入一个dict做为params
参数:
>>> r = requests.get('https://www.douban.com/search', params={'q': 'python', 'cat': '1001'})
>>> r.url # 实际请求的URL
'https://www.douban.com/search?q=python&cat=1001'
复制代码
requests自动检测编码,可使用encoding
属性查看:
>>> r.encoding
'utf-8'
复制代码
不管响应是文本仍是二进制内容,咱们均可以用content
属性得到bytes
对象:
>>> r.content
b'<!DOCTYPE html>\n<html>\n<head>\n<meta http-equiv="Content-Type" content="text/html; charset=utf-8">\n...'
复制代码
requests的方便之处还在于,对于特定类型的响应,例如JSON,能够直接获取:
>>> r = requests.get('https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20weather.forecast%20where%20woeid%20%3D%202151330&format=json')
>>> r.json()
{'query': {'count': 1, 'created': '2017-11-17T07:14:12Z', ...
复制代码
须要传入HTTP Header时,咱们传入一个dict做为headers
参数:
>>> r = requests.get('https://www.douban.com/', headers={'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit'})
>>> r.text
'<!DOCTYPE html>\n<html>\n<head>\n<meta charset="UTF-8">\n <title>豆瓣(手机版)</title>...'
复制代码
要发送POST请求,只须要把get()
方法变成post()
,而后传入data
参数做为POST请求的数据:
>>> r = requests.post('https://accounts.douban.com/login', data={'form_email': 'abc@example.com', 'form_password': '123456'})
复制代码
requests默认使用application/x-www-form-urlencoded
对POST数据编码。若是要传递JSON数据,能够直接传入json参数:
params = {'key': 'value'}
r = requests.post(url, json=params) # 内部自动序列化为JSON
复制代码
相似的,上传文件须要更复杂的编码格式,可是requests把它简化成files
参数:
>>> upload_files = {'file': open('report.xls', 'rb')}
>>> r = requests.post(url, files=upload_files)
复制代码
在读取文件时,注意务必使用'rb'
即二进制模式读取,这样获取的bytes
长度才是文件的长度。
把post()
方法替换为put()
,delete()
等,就能够以PUT或DELETE方式请求资源。
除了能轻松获取响应内容外,requests对获取HTTP响应的其余信息也很是简单。例如,获取响应头:
>>> r.headers
{Content-Type': 'text/html; charset=utf-8', 'Transfer-Encoding': 'chunked', 'Content-Encoding': 'gzip', ...}
>>> r.headers['Content-Type']
'text/html; charset=utf-8'
复制代码
requests对Cookie作了特殊处理,使得咱们没必要解析Cookie就能够轻松获取指定的Cookie:
>>> r.cookies['ts']
'example_cookie_12345'
复制代码
要在请求中传入Cookie,只需准备一个dict传入cookies
参数:
>>> cs = {'token': '12345', 'status': 'working'}
>>> r = requests.get(url, cookies=cs)
复制代码
最后,要指定超时,传入以秒为单位的timeout参数:
>>> r = requests.get(url, timeout=2.5) # 2.5秒后超时
复制代码
用来检测编码。
若是安装了Anaconda,chardet就已经可用了。不然,须要在命令行下经过pip安装:
$ pip install chardet
复制代码
若是遇到Permission denied安装失败,请加上sudo重试。
当咱们拿到一个bytes
时,就能够对其检测编码。用chardet检测编码,只须要一行代码:
>>> chardet.detect(b'Hello, world!')
{'encoding': 'ascii', 'confidence': 1.0, 'language': ''}
复制代码
检测出的编码是ascii
,注意到还有个confidence
字段,表示检测的几率是1.0(即100%)。
咱们来试试检测GBK编码的中文:
>>> data = '离离原上草,一岁一枯荣'.encode('gbk')
>>> chardet.detect(data)
{'encoding': 'GB2312', 'confidence': 0.7407407407407407, 'language': 'Chinese'}
复制代码
检测的编码是GB2312
,注意到GBK是GB2312的超集,二者是同一种编码,检测正确的几率是74%,language
字段指出的语言是'Chinese'
。
对UTF-8编码进行检测:
>>> data = '离离原上草,一岁一枯荣'.encode('utf-8')
>>> chardet.detect(data)
{'encoding': 'utf-8', 'confidence': 0.99, 'language': ''}
复制代码
咱们再试试对日文进行检测:
>>> data = '最新の主要ニュース'.encode('euc-jp')
>>> chardet.detect(data)
{'encoding': 'EUC-JP', 'confidence': 0.99, 'language': 'Japanese'}
复制代码
可见,用chardet检测编码,使用简单。获取到编码后,再转换为str
,就能够方便后续处理。
chardet支持检测的编码列表请参考官方文档Supported encodings。
psutil = process and system utilities,它不只能够经过一两行代码实现系统监控,还能够跨平台使用,支持Linux/UNIX/OSX/Windows等,是系统管理员和运维小伙伴不可或缺的必备模块。
若是安装了Anaconda,psutil就已经可用了。不然,须要在命令行下经过pip安装:
$ pip install psutil
复制代码
若是遇到Permission denied安装失败,请加上sudo重试。
>>> import psutil
>>> psutil.cpu_count() # CPU逻辑数量
4
>>> psutil.cpu_count(logical=False) # CPU物理核心
2
# 2说明是双核超线程, 4则是4核非超线程
复制代码
psutil还能够获取用户信息、Windows服务等不少有用的系统信息,具体请参考psutil的官网:github.com/giampaolo/p…