一.collections
1. namedtuple
namedtuple是一个函数,它用来创建一个自定义的tuple对象,并且规定了tuple元素的个数,并可以用属性而不是索引来引用tuple的某个元素。
from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'])
p = Point(1, 2)
print p.x
print p.y
2.deque
deque是为了实现高效插入和高效删除操作的双向列表,适合用于队列和栈
from collections import deque
q = deque(['a', 'b', 'c'])
q.append('x') # 往尾部添加
q.appendleft('y') # 往头部添加
print q # deque(['y', 'a', 'b', 'c', 'x'])
q.pop() # 弹出元素
q.popleft()
print q # deque(['a', 'b', 'c'])
3.defaultdict
使用dict时,如果引用的key不存在,就会抛出KeyError。如果希望Key不存在时,返回一个默认值,就可以使用defaultdict。
注意:OrderedDict的Key会按照插入的顺序排序,不是Key本身排序。
from collections import defaultdict4.OrderedDict
dd = defaultdict(lambda: 'N/A')
dd['key1'] = 'abc'
print dd['key1'] # key1存在,返回‘abc’
print dd['key2'] # key2不存在,返回默认值 ‘N/A’
使用dict时,Key是无序的,在对dict做迭代时,我们无法确定Key的顺序。如果要保持Key的顺序,可以用OrderedDict:
from collections import OrderedDict
d = dict([('a', 1), ('b', 2), ('c', 3)])
print d # dict的Key是无序的 {'a': 1, 'c': 3, 'b': 2}
od = OrderedDict([('a', 1), ('b', 2), ('c', 3)])
print od # OrderedDict的Key是有序的 OrderedDict([('a', 1), ('b', 2), ('c', 3)])
5.Counter
Counter是一个简单的计数器,实际上它也是dict的一个子类:
from collections import Counter
c = Counter()
for ch in 'programming':
c[ch] = c[ch] + 1
print c
# Counter({'g': 2, 'm': 2, 'r': 2, 'a': 1, 'i': 1, 'o': 1, 'n': 1, 'p': 1})
二.base64
base64是一种任意二进制到文本字符串的编码方式,常用于在URL、Cookie、网页中传输少量二进制数据
import base64
print base64.b64encode('binary string')
# 'YmluYXJ5AHN0cmluZw=='
print base64.b64decode('YmluYXJ5IHN0cmluZw==')
# 'binary string'
三.struct
使用struct可以解决str和其他二进制数据类型的转换。
import struct
print struct.pack('>I', 10240099) # '\x00\x9c@c'
print struct.unpack('>IH', '\xf0\xf0\xf0\xf0\x80\x80') # (4042322160, 32896)
四.hashlib
hashlib提供了常见的摘要算法:MD5,SHA1等
摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串。
import hashlibMD5通常用于存储用户口令的摘要,当用户登录时,首先计算用户输入的明文口令的MD5,然后和数据库存储的MD5对比,如果一致,说明口令输入正确;如果不一致,口令肯定错误。
md5 = hashlib.md5()
md5.update('how to use md5 in python hashlib?')
print md5.hexdigest()
sha1 = hashlib.sha1()
sha1.update('how to use sha1 in python hashlib?')
print sha1.hexdigest()
五.itertools
1. itertools提供了几个无限迭代器:
import itertools无限序列虽然可以无限迭代下去,但是我们通常会通过takewhile函数根据条件判断来截取出一个有限的序列:
natuals = itertools.count(1)
for n in natuals:
print n # 无限打印出自然数
import itertools
cs = itertools.cycle('ABC') # 注意字符串也是序列的一种
for c in cs:
print c # 无限打印出 A, B, C
ns = itertools.repeat('A', 10)
for n in ns:
print n # 打印10次A
import itertoolsnatuals = itertools.count(1)ns = itertools.takewhile(lambda x: x <= 10, natuals)for n in ns: print n
2. chain可以把一组迭代对象串联起来,形成一个更大的迭代器:
import itertools3. groupby把迭代器中相邻的重复元素挑出来放在一起:
for c in chain('ABC', 'XYZ'):
print c
# 迭代效果:'A' 'B' 'C' 'X' 'Y' 'Z'
import itertoolsfor key, group in itertools.groupby('AAABBBCCAAA'): print key, list(group) ###################### A ['A', 'A', 'A']# B ['B', 'B', 'B']# C ['C', 'C']# A ['A', 'A', 'A']###################### 传入一个匿名函数,忽略大小写分组for key, group in itertools.groupby('AaaBBbcCAAa', lambda c: c.upper()): print key, list(group)##################### # A ['A', 'a', 'a']# B ['B', 'B', 'b']# C ['c', 'C']# A ['A', 'A', 'a']#####################
4. imap和map的区别是:imap可以作用于无穷序列
注意:imap返回一个迭代对象,而map返回list
import itertools5. ifilter是filter的惰性实现。
for x in itertools.imap(lambda x, y: x * y, [10, 20, 30], itertools.count(1)):
print x # 10 40 90
# 匿名函数传入两个值相乘:10*1, 20*2, 30*3
六.XML
使用sax解析xml:
from xml.parsers.expat import ParserCreate
class DefaultSaxHandler(object):
def start_element(self, name, attrs):
print('sax:start_element: %s, attrs: %s' % (name, str(attrs)))
def end_element(self, name):
print('sax:end_element: %s' % name)
def char_data(self, text):
print('sax:char_data: %s' % text)
xml = r'''<?xml version="1.0"?>
<ol>
<li><a href="/python">Python</a></li>
<li><a href="/ruby">Ruby</a></li>
</ol>
'''
handler = DefaultSaxHandler()
parser = ParserCreate()
parser.returns_unicode = True
parser.StartElementHandler = handler.start_element
parser.EndElementHandler = handler.end_element
parser.CharacterDataHandler = handler.char_data
parser.Parse(xml)
七.HTMLParser
使用python解析xml:
from HTMLParser import HTMLParser
from htmlentitydefs import name2codepoint
class MyHTMLParser(HTMLParser):
def handle_starttag(self, tag, attrs):
print('<%s>' % tag)
def handle_endtag(self, tag):
print('</%s>' % tag)
def handle_startendtag(self, tag, attrs):
print('<%s/>' % tag)
def handle_data(self, data):
print('data')
def handle_comment(self, data):
print('<!-- -->')
def handle_entityref(self, name):
print('&%s;' % name)
def handle_charref(self, name):
print('&#%s;' % name)
parser = MyHTMLParser()
parser.feed('<html><head></head><body><p>Some <a href=\"#\">html</a> tutorial...<br>END</p></body></html>')