一.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 defaultdict dd = defaultdict(lambda: 'N/A') dd['key1'] = 'abc' print dd['key1'] # key1存在,返回‘abc’ print dd['key2'] # key2不存在,返回默认值 ‘N/A’4.OrderedDict
使用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 hashlib 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()MD5通常用于存储用户口令的摘要,当用户登录时,首先计算用户输入的明文口令的MD5,然后和数据库存储的MD5对比,如果一致,说明口令输入正确;如果不一致,口令肯定错误。
五.itertools
1. itertools提供了几个无限迭代器:
import itertools 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无限序列虽然可以无限迭代下去,但是我们通常会通过takewhile函数根据条件判断来截取出一个有限的序列:
import itertools natuals = itertools.count(1) ns = itertools.takewhile(lambda x: x <= 10, natuals) for n in ns: print n
2. chain可以把一组迭代对象串联起来,形成一个更大的迭代器:
import itertools for c in chain('ABC', 'XYZ'): print c # 迭代效果:'A' 'B' 'C' 'X' 'Y' 'Z'3. groupby把迭代器中相邻的重复元素挑出来放在一起:
import itertools for 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 itertools 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*35. ifilter是filter的惰性实现。
六.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>')