python学习笔记(十二) - 常用内建模块

时间:2021-09-25 00:31:57

一.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 itertoolsnatuals = 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 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 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*3
5. 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>')