Python学习IX --- 常用模块

这篇博客主要是阅读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 则经常用作数字签名。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值