安裝完Python之后,我們也同時獲得了強大的Python標准庫,通過使用這些標准庫可以為我們節省大量的時間。這里是一些常用標准庫的簡單說明。更多的標准庫的說明,可以參考Python文檔
sys 模塊
sys模塊能夠訪問與Python解釋器緊密聯系的變量和函數,下面是 sys
模塊中一些常用的函數和變量:
argv 命令行參數,包括腳本名稱 exit([arg]) 退出當前程序,可選參數給定的返回值或錯誤信息 modules 隱射模塊名字到載入模塊的字典 path 查看模塊所在目錄的目錄名列表 platform 類似sunos5或win32平台標識符 stdin 標准輸入流——一個類文件(file-like)對象 stdout 標准輸出流——一個類文件對象 stderr 標准錯誤流——一個類文件對象
下面的示例通過 argv
獲取命令行參數,然后將其反轉:
import sys args = sys.argv[1:] # 跳過第一個元素(腳本名稱) args.reverse() print ' '.join(args)
更多使用方法,可以查看Python 文檔:http://docs.python.org/2/library/sys.html
os模塊
os模塊提供了很多訪問操作系統服務的功能。下面是一些常用的函數和變量:
environ 會環境變量進行隱射 system(command) 在子shell中執行操作系統命令 sep 路徑中的分隔符 pathsep 分隔路徑的分隔符 linesep 行分隔符('\n','\r','\r\n') urandom(n) 返回n自己的加密強隨機數
下面示例通過 environ
變量來查詢環境變量中的 path
變量值:
import os # C:\Perl64\site\bin;C:\Perl64\... print os.environ['path']
根據不同的操作系統返回對於的路徑分隔符:
# -- coding: utf-8 -- import os # 返回操作系統中的路徑分隔符 # windows:'\' # UNIX/LINUX:'/' # Mac OS:':' print os.sep
更多使用方法,可以查看Python 文檔:http://docs.python.org/2/library/os.html
fileinput 模塊
fileinput
模塊可以輕松的遍歷文本文件的所有行。下面是 fileinput
模塊中重要的函數:
input([files[, inplace[. backup]]) 便於遍歷多個輸入流中的行
filename() 返回當前文件的名稱
filelineno() 返回當前處理文件當前(累計)行數
isfirstline() 檢查當前行是否是文件的第一行
isstdin() 檢查最后一行是否來自sys.stdin
nextfile() 關閉當前文件,移動到下一個文件
close() 關閉序列
更多使用方法,可以查看Python 文檔:http://docs.python.org/2/library/fileinput.html
集合
集合(set)在Python 2.3 引入。Set類位於 sets
模塊中。使用集合不需要導入,直接使用即可:
print set(range(10)) # set([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
集合是由序列(或者其他可迭代對象)構建的,它們主要用於檢查成員資格,因此副本是被忽略的:
print set([0, 1, 2, 3, 1, 2, 3]) # set([0, 1, 2, 3])
除了檢查成員資格,還可以使用標准的集合操作,如:並集和交集,既可以使用方法,也可以直接使用運算操作符:
1 a = set([1,2,3]) 2 b = set([2,3,4,5]) 3 print a.union(b) # set([1, 2, 3, 4, 5]) 4 print a | b # set([1, 2, 3, 4, 5]) 5 6 c = a & b 7 print c.issubset(a) # True 8 9 print c <= a # True 10 print c.intersection(b) # set([2, 3]) 11 12 print a & b # set([2, 3]) 13 print a.difference(b) # set([1]) 14 15 print a - b # set([1]) 16 print a.symmetric_difference(b) # set([1, 4, 5]) 17 18 print a ^ b # set([1, 4, 5]) 19 print a.copy() # set([1, 2, 3]) 20 print a.copy() is a # False
更多使用運算符和方法,可以查看Python 文檔:http://docs.python.org/2/library/sets.html
集合是可變的,且本身只能包含不可變值,但是一個包含集合的集合是常見的,這時,我們只需使用 frozenset
類型對集合進行包裝即可,frozenset
構造函數可以創建給定集合的一個副本:
a = set([1,2,3]) b = set([2,3,4,5]) a.add(frozenset(b)) print a # set([1, 2, 3, frozenset([2, 3, 4, 5])])
堆
堆(heap)是優先隊列的一種。使用優先隊列能夠以任意順序增加對象,並且能在任何時間(可能在增加對象的同時)找到(也可能是移除)最小的元素(比列表的min方法更有效率)。在Python中沒有獨立的堆類型——只有一個包含一些堆操作的模塊,該模塊是 heapq
,包含了六個函數:
heappush(heap,x) 將x入堆
heappop(heap) 將堆中最小的元素彈出
heapify(heap) 將heap屬性強制應用到任意一個列表
heapreplace(heap,x) 將堆中最小的元素彈出,同時將x入堆
nlargest(n,iter) 返回iter中第n大的元素
nsmallest(n,iter) 返回iter中第n小的元素
heappush
函數用於增加堆的項,如下:
1 from heapq import * 2 from random import shuffle 3 4 data = range(10) 5 shuffle(data) 6 heap = [] 7 for n in data: 8 heappush(heap,n) 9 10 print heap # [0, 2, 1, 4, 3, 7, 5, 9, 6, 8] 11 12 heappush(heap,0.5) 13 print heap # [0, 0.5, 5, 3, 1, 6, 7, 9, 8, 4, 2]
更詳細的使用方法和文檔,請參考Python文檔:http://docs.python.org/2/library/heapq.html
堆屬性(heap property)
堆元素的排序是有規則的:位於i位置上的元素總比i//2位置處的元素大(或者說位置i處的元素總比2i以及21+1位置處的元素小)
雙端隊列
雙端隊列(Double-ended queue)在需要按照元素增加的順序來移除元素時非常有用。雙端隊列通過可迭代對象(比如集合)創建:
1 from collections import deque 2 3 q = deque(range(5)) 4 q.append(5) 5 q.appendleft(6) 6 7 print q # deque([6, 0, 1, 2, 3, 4, 5]) 8 print q.pop() # 5 9 10 q.rotate(3) 11 print q # deque([2, 3, 4, 6, 0, 1]) 12 13 q.rotate(-1) 14 print q # deque([3, 4, 6, 0, 1, 2])
更詳細的使用方法和文檔,請參考Python文檔:http://docs.python.org/2/library/collections.html#collections.deque
time 模塊
time 模塊所包含的函數能夠實現以下功能:獲取當前時間、操作時間和日期、從字符串讀取時間以及格式化時間字符串。日期可以使用實數(從“新紀元”的1月1日0 點開始計算到現在的秒數,新紀元是一個與平台相關的年份,對於UNIX來說是1970年),或者是包含9個整數的元組,它們分別表示下面的含義:
(2008,1,21,12,2,56,0,21,0) # 年、月、日、時、分、秒、周、儒日歷、夏令時
下面是 time 模塊最常用的函數:
asctime([tuple]) 將時間元組轉換為字符串
localtime([secs]) 將秒數轉換為日期元組,以本地時間為准
mktime(tuple) 將時間元組轉換為本地時間
sleep(secs) 休眠 secs秒
strptime(string[, format]) 將字符串解析為時間元組
time() 當前時間(新紀元開始后的秒數,以UTC為准)
更詳細的使用方法和文檔,請參考Python文檔:http://docs.python.org/2.7/library/time.html
此外,除了 time 模塊,Python還提供了兩個和時間密切相關的模塊:
random 模塊
random 模塊包含返回隨機數(偽隨機數)的函數,下面是 random
模塊的重要函數:
random() 返回 0 ≤ n < 1 之間的隨機實數n,其中 0 < n ≤ 1 getrandbits(n) 以長整型形式返回n個隨機數 uniform(a,b) 返回隨機實數n,其中 a ≤ n < b randrange([start],stop,[step]) 返回range(start,stop,step)中的隨機數 choice(seq) 從序列seq中返回隨意元素 shuffle(seq[, random]) 原地指定序列seq sample(seq,n) 從序列seq中選擇n個隨機且獨立的元素
下面的示例可以隨機產生2008 ~ 2009 之間的隨機一天:
from random import * from time import * date1 = (2008,1,1,0,0,0,-1,-1,-1) time1 = mktime(date1) date2 = (2009,1,1,0,0,0,-1,-1,-1) time2 = mktime(date2) random_time = uniform(time1,time2) print asctime(localtime(random_time))
更詳細的使用方法,請參考Python文檔:http://docs.python.org/2/library/random.html
shelve 模塊
使用 shelve
模塊提供了一個簡單的文件存儲方案。我們可以將一個對象持久化到文件中,如下:
1 import sys, shelve 2 3 def main(): 4 data = shelve.open("D:\\data.dat") 5 employee = {} 6 employee['name'] = 'sunshine' 7 employee['email'] = 'sunshine@gmail.com' 8 pid = '1' 9 try: 10 data[pid] = employee 11 finally: 12 data.close() 13 14 if __name__ == '__main__': main()
持久化之后,可以再次讀取文件中的內容:
import sys, shelve def main(): pid = '1' data = shelve.open("D:\\data.dat") print data[pid] # {'name': 'sunshine', 'email': 'sunshine@gmail.com'} if __name__ == '__main__': main()
更詳細的使用方法,請參考Python文檔:http://docs.python.org/2/library/shelve.html