python學習筆記(十二),python學習筆記
一.collections
1. namedtuple
namedtuple是一個函數,它用來建立一個自訂的tuple對象,並且規定了tuple元素的個數,並可以用屬性而不是索引來引用tuple的某個元素。
from collections import namedtuplePoint = namedtuple('Point', ['x', 'y'])p = Point(1, 2)print p.xprint p.y
2.deque
deque是為了實現高效插入和高效刪除操作的雙向列表,適合用於隊列和棧
from collections import dequeq = 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 defaultdictdd = 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 OrderedDictd = 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 Counterc = 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 base64print base64.b64encode('binary string')# 'YmluYXJ5AHN0cmluZw=='print base64.b64decode('YmluYXJ5IHN0cmluZw==')# 'binary string'
三.struct
使用struct可以解決str和其他位元據類型的轉換。
import structprint 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 = 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 itertoolsnatuals = itertools.count(1)for n in natuals: print n # 無限列印出自然數import itertoolscs = itertools.cycle('ABC') # 注意字串也是序列的一種for c in cs: print c # 無限列印出 A, B, Cns = 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 itertoolsfor 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 itertoolsfor 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 ParserCreateclass 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 = Trueparser.StartElementHandler = handler.start_elementparser.EndElementHandler = handler.end_elementparser.CharacterDataHandler = handler.char_dataparser.Parse(xml)
七.HTMLParser
使用python解析xml:
from HTMLParser import HTMLParserfrom htmlentitydefs import name2codepointclass 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>')