这篇博客主要是阅读python之旅 时做的笔记。提取出最主要的知识点,供个人在以后中快速查阅。
Base64
Base64,简单地讲,就是用 64 个字符来表示二进制数据的方法。这 64 个字符包含小写字母 a-z、大写字母 A-Z、数字 0-9 以及符号”+”、”/”,其实还有一个 “=” 作为后缀用途,所以实际上有 65 个字符。Base64 可以将任意二进制数据编码到文本字符串,常用于在 URL、Cookie 和网页中传输少量二进制数据。
#对文本进行Base64的编码和解码
>>> import base64
>>> str = 'hello world'
>>>
>>> base64_str = base64.b64encode(str) # 编码
>>> print base64_str
aGVsbG8gd29ybGQ=
>>>
>>> ori_str = base64.b64decode(base64_str) # 解码
>>> print ori_str
hello world
#对图片进行Base64的编码和解码
def convert_image():
# 原始图片 ==> base64 编码
with open('/path/to/alpha.png', 'r') as fin:
image_data = fin.read()
base64_data = base64.b64encode(image_data)
fout = open('/path/to/base64_content.txt', 'w')
fout.write(base64_data)
fout.close()
# base64 编码 ==> 原始图片
with open('/path/to/base64_content.txt', 'r') as fin:
base64_data = fin.read()
ori_image_data = base64.b64decode(base64_data)
fout = open('/path/to/beta.png', 'wb'):
fout.write(ori_image_data)
fout.close()
collections — 5个高性能数据类型
- Counter : 计数器
- OrderedDict:有序字典
- nametuple:生成可以通过属性访问元素内容的tuple子类
- deque:双端队列,能够在队列两端添加或删除元素
counter
简单的计数器,可用于统计字符串、列表等元素的个数
>>> from collections import Counter
>>>
>>> s = 'aaaabbbccd'
>>> c = Counter(s) # 创建了一个 Counter 对象
>>> c
Counter({'a': 4, 'b': 3, 'c': 2, 'd': 1})
>>> isinstance(c, dict) # c 其实也是一个字典对象
True
>>> c.get('a')
4
# 这个功能好
>>> c.most_common(2) # 获取出现次数最多的前两个元素
[('a', 4), ('b', 3)]
Counter对象也可以做运算
>>> from collections import Counter
>>>
>>> s1 = 'aaaabbbccd'
>>> c1 = Counter(s1)
>>> c1
Counter({'a': 4, 'b': 3, 'c': 2, 'd': 1})
>>>
>>> s2 = 'aaabbef'
>>> c2 = Counter(s2)
>>> c2
Counter({'a': 3, 'b': 2, 'e': 1, 'f': 1})
>>>
>>> c1 + c2 # 两个计数结果相加
Counter({'a': 7, 'b': 5, 'c': 2, 'e': 1, 'd': 1, 'f': 1})
>>> c1 - c2 # c2 相对于 c1 的差集
Counter({'c': 2, 'a': 1, 'b': 1, 'd': 1})
>>> c1 & c2 # c1 和 c2 的交集
Counter({'a': 3, 'b': 2})
>>> c1 | c2 # c1 和 c2 的并集
Counter({'a': 4, 'b': 3, 'c': 2, 'e': 1, 'd': 1, 'f': 1})
OrderedDict
python中dict是无序的,
>>> dict([('a', 10), ('b', 20), ('c', 15)])
{'a': 10, 'c': 15, 'b': 20} #无序
如果要其保持key的顺序,
>>> from collections import OrderedDict
>>> OrderedDict([('a', 10), ('b', 20), ('c', 15)])
OrderedDict([('a', 10), ('b', 20), ('c', 15)])
defaultdict
就是给不存在的key设置一个默认值。当然啊,如果是传入int,则默认值为0,list,默认值为[], str默认值为’ ‘
>>> from collections import defaultdict
>>> d = defaultdict(int) # 默认的 value 值是 0
>>> s = 'aaabbc'
>>> for char in s:
... d[char] += 1
...
>>> d
defaultdict(<type 'int'>, {'a': 3, 'c': 1, 'b': 2})
>>> d.get('a')
3
>>> d['z']
0
#利用lambda函数自定义默认值
>>> from collections import defaultdict
>>>
>>> d = defaultdict(lambda: 10)
>>> d['a']
10
namedtuple
tuple经常表示一个不可变的对象
>>> stu = ('ethan', '001', 20)
>>> stu[0]
'ethan'
一个问题就是,我们必须要清楚每个索引代表的含义。nametuple就是可以设置元组的每个索引的含义,这样的话就可以直接通过属性名来进行访问
>>> from collections import namedtuple
>>> Student = namedtuple('Student', ['name', 'id', 'age']) # 定义了一个 Student 元组
>>>
>>> stu = Student('ethan', '001', 20)
>>> stu.name
'ethan'
>>> stu.id
'001'
deque
>>> from collections import deque
>>> q = deque(['a', 'b', 'c', 'd'])
>>> q.append('e') # 添加到尾部
>>> q
deque(['a', 'b', 'c', 'd', 'e'])
>>> q.appendleft('o') # 添加到头部
>>> q
deque(['o', 'a', 'b', 'c', 'd', 'e'])
>>> q.pop() # 从尾部弹出元素
'e'
>>> q
deque(['o', 'a', 'b', 'c', 'd'])
>>> q.popleft() # 从头部弹出元素
'o'
>>> q
deque(['a', 'b', 'c', 'd'])
>>> q.extend('ef') # 在尾部 extend 元素
>>> q
deque(['a', 'b', 'c', 'd', 'e', 'f'])
>>> q.extendleft('uv') # 在头部 extend 元素,注意顺序
>>> q
deque(['v', 'u', 'a', 'b', 'c', 'd', 'e', 'f'])
>>>
>>> q.rotate(2) # 将尾部的两个元素移动到头部
>>> q
deque(['e', 'f', 'v', 'u', 'a', 'b', 'c', 'd'])
>>> q.rotate(-2) # 将头部的两个元素移动到尾部
>>> q
deque(['v', 'u', 'a', 'b', 'c', 'd', 'e', 'f'])
其中,rotate 方法用于旋转,如果旋转参数 n 大于 0,表示将队列右端的 n 个元素移动到左端,否则相反。
datetime
当前时间
>>> from datetime import datetime
>>> datetime.now() # 返回一个 datetime 对象,这里是当地时间
datetime.datetime(2016, 12, 10, 11, 32, 43, 806970)
>>> datetime.utcnow() # 返回一个 datetime 对象,这里是 UTC 时间
datetime.datetime(2016, 12, 10, 3, 32, 49, 999423)
>>> datetime.now().year, datetime.now().month, datetime.now().day # 年月日
(2016, 12, 10)
>>> datetime.now().hour, datetime.now().minute, datetime.now().second # 时分秒
(11, 35, 37)
时间格式化
>>> from datetime import datetime
# 获取当前当地时间
>>> now = datetime.now()
>>> now
datetime.datetime(2016, 12, 10, 11, 46, 24, 432168)
# 对 datetime 对象进行格式化,转为字符串格式
>>> now_str = now.strftime('%Y-%m-%d %H:%M:%S.%f')
>>> now_str
'2016-12-10 11:46:24.432168'
# 对字符串对象进行格式化,转为 datetime 对象
>>> datetime.strptime(now_str, '%Y-%m-%d %H:%M:%S.%f')
datetime.datetime(2016, 12, 10, 11, 46, 24, 432168)
hashlib
>>> import hashlib
>>>
>>> m = hashlib.md5('md5 test in Python!')
>>> m.digest()
'\xad\xc0\x99\x01\x12\xc7&\xb5~\xb0\xaf \x974\x11\xab'
>>> m.hexdigest() # 使用一个 32 位的 16 进制字符串表示
'adc0990112c726b57eb0af20973411ab'
上面,我们是直接把数据传入 md5() 函数,我们也可以通过一次或多次使用 update 来实现:
>>> import hashlib
>>> m = hashlib.md5()
>>> m.update('md5 test ')
>>> m.update('in Python!')
>>> m.hexdigest()
'adc0990112c726b57eb0af20973411ab'
SHA1
>>> import hashlib
>>>
>>> sha1 = hashlib.sha1()
>>> sha1.update('md5 test ')
>>> sha1.update('in Python!')
>>> sha1.hexdigest()
'698a8b18d5f99a140520475c342af455183c58a3'
MD5 经常用来做用户密码的存储,而 SHA1 则经常用作数字签名。