【循序漸進學Python】11.常用標准庫


安裝完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還提供了兩個和時間密切相關的模塊:

  • datetime 模塊() 支持日期和時間的算法
  • timeit 模塊 計算代碼段執行時間

 

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

 

參考資料&進一步閱讀

Python基礎教程(第二版)

Python Document


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM