“Batteries included”是Python語言的設計哲學之一,Python的標準安裝直接包含了許多有用的模組,標準模組庫提供各式各樣的應用,大體上,絕大多數的工作都能藉由引入標準模組庫的模組來完成。
有哪些模組呢?包括數學相關工具、網路及其協定相關工具、標記語言相關工具、檔案及目錄相關工具、壓縮相關工具、資料處理相關工具、作業系統相關工具、多媒體相關工具、圖形使用者介面相關工具、程式發展相關工具………...等等。
很多呢!不是嗎?引入的方式就跟自行定義的套件一樣,唯一不同的,標準模組庫所存放的位置在Python的安裝路徑內,所以直譯器自己就知道位置,我們只需引入就可。現在我們以常見的帳號密碼輸入做一個例子。
#《電腦做什麼事》的範例程式碼 http://pydoing.blogspot.com/
#-*- coding: UTF-8 -*-
from getpass import getpass
data = {"kaiching":"0000"}
def hello(name):
print
print "歡迎光臨,", name, "!"
if __name__ == "__main__":
name = raw_input("請輸入登錄帳號: ")
word = getpass("請輸入登錄密碼: ")
if data.has_key(name):
if word == data[name]:
hello(name)
else:
print "密碼錯誤!"
else:
print "註冊後才能登錄!"
print
raw_input("請按<Enter>來結束視窗。")這個程式首先引入標準模組庫getpass模組中的getpass函數,這個函數會隱藏使用者輸入密碼時的顯示,然後將其輸入回傳為字串格式。我們用字典型態的變數data儲存已註冊的使用者資料,如果使用者輸入的帳號密碼都符合,便以hello函數顯示歡迎詞。
若是輸入的帳號錯誤,就顯示「註冊後才能登錄!」,若是帳號正確而密碼錯誤,就顯示「密碼錯誤!」。我們來看看程式順利執行的情況吧!

math
math模組提供許多有用的數學工具,包括計算log函數、三角函數值等,我們用一個例子來看看吧!
#《電腦做什麼事》的範例程式碼 http://pydoing.blogspot.com/
#-*- coding: UTF-8 -*-
import math
def result(number):
print
print "大於%.2f,最接近的整數為%d" %(number, int(math.ceil(number)))
print "小於%.2f,最接近的整數為%d" %(number, int(math.floor(number)))
print "%.2f以2為底的log數為%.2f" %(number, math.log(number, 2))
print "%.2f的平方根為%.2f" %(number, math.sqrt(number))
print "%.2f度可轉換為%.2fπ" %(number, math.radians(number)/math.pi)
print "sin(%.2f) = %.2f" %(number, math.sin(math.radians(number)))
print "cos(%.2f) = %.2f" %(number, math.cos(math.radians(number)))
print "tan(%.2f) = %.2f" %(number, math.tan(math.radians(number)))
print
if __name__ == "__main__":
while True:
try:
number = float(raw_input("請輸入0到360之間的數字: "))
if number < 0:
print "輸入的是負數,稍後會轉換為正數....."
print
number = math.fabs(number)
if number > 360:
print "絕對值大於360!"
raise ValueError
else:
result(number)
break
elif number > 360:
raise ValueError
else:
result(number)
break
except ValueError:
print "請再輸入一次!"
raw_input("請按<Enter>來結束視窗。")result函數用來顯示計算結果,使用者輸入的數字儲存到變數number之中,由上而下依序是計算大於number的最小整數,小於number的最大整數,接者是log2(number)、number的平方根、轉換number為弧度,然後計算sin(number)、cos(number)與tan(number)。
這裡用了個小技巧,我們限制使用者輸入的數字介於0到360之間,而且避免使用者輸入的不是數字,「while True」迴圈與try…except…陳述會進行到使用者輸入正確為止。而如果使用者輸入的是負數,絕對值小於360,程式仍會接受並利用math模組中的fabs()函數,轉換負數為正數。
當使用者輸入是被允許的0到360之間的數字,或是絕對值小於360的複數,程式就會執行result函數印出計算結果,緊接呼叫完result函數後的break陳述,這是為了跳出「while True」,使程式可以結束。
我們來看看輸入30的計算結果吧!

有關math模組的詳細資訊,詳情可參考Python Library Reference的math。
time
time模組提供許多處理時間的工具,我們以印出現在時間為例。
#《電腦做什麼事》的範例程式碼 http://pydoing.blogspot.com/
#-*- coding: UTF-8 -*-
from time import sleep, asctime
weeks = {"Mon":"星期一", "Tue":"星期二", "Wed":"星期三", "Thu":"星期四", "Fri":"星期五", "Sat":"星期六", "Sun":"星期日"}
months = {"Jan":"一月", "Feb":"二月", "Mar":"三月", "Apr":"四月", "May":"五月", "Jun":"六月", "Jul":"七月", "Aug":"八月", "Sep":"九月", "Oct":"十月", "Nov":"十一月", "Dec":"十二月"}
moment = asctime()
def now():
print "今天是西元", moment[20:], "年", months[moment[4:7]],
print moment[8:10], "號", weeks[moment[:3]]
print "現在的時間是", moment[11:19]
print
if __name__ == "__main__":
now()
print
print "倒數十秒開始....."
i = 10
while i > 0:
print "時間還有", i, "秒",
sleep(1)
print "\r",
i = i - 1
print
print "十秒過後.....你看見消失的時間了嗎?"
print "現在的時間是", asctime()[11:19]
print
raw_input("請按<Enter>來結束視窗。")time模組中的asctime()函數會去抓現在電腦的時間,然後回傳一個字串,格式如下。
#《電腦做什麼事》的範例程式碼 #http://pydoing.blogspot.com/ 'Thu Aug 14 15:42:14 2008'
Thu是Thursday的縮寫,Thursday則是星期四的英文,同樣的Aug是August的縮寫,而August是八月的縮寫,所以這個字串可看成星期、月、日、時、分、秒、年的排列。我們利用兩個字典型態英文縮寫與中文的相對名稱,然後利用變數moment儲存現在時間的字串。
我們自行定義函數now印出現在時間,第一行是中文習慣的年、月、日、星期,第二行則是現在時間。然後利用time模組的另一個sleep()函數執行倒數計時,其參數為數字,單位為秒,在這個程式中每呼叫一次便暫停1秒,效果如下。

最後的執行結果如下。

有關time模組的詳細資訊,詳情可參考Python Library Reference的time。
sys
sys模組提供了許多輔助程式執行的函數與變數,例如變數platform可以偵測作業系統類型,而變數version則可偵測Python版本,函數exit()則可用來結束程式。
我們利用「while True」迴圈與函數exit()寫選單式的程式。
#《電腦做什麼事》的範例程式碼 http://pydoing.blogspot.com/
#-*- coding: UTF-8 -*-
from sys import exit, platform, version
def whatplatform():
if platform == "win32":
print "您所使用的是MS-Windows作業系統。"
elif platform == "linux2":
print "您所使用的是Linux作業系統。"
elif platform == "darwin":
print "您所使用的是Mac作業系統。"
else:
print "程式未能偵測到您所使用的作業系統種類。"
def fun1():
print "這是「選單一」。"
raw_input("請按<Enter>繼續。")
def fun2():
print "這是「選單二」。"
raw_input("請按<Enter>繼續。")
if __name__ == "__main__":
whatplatform()
print "您的Python版本為", version[:5]
print
while True:
print "(1) 選單一......"
print "(2) 選單二......"
c = raw_input("請輸入選擇,或按q離開程式: ")
if c == "1":
fun1()
elif c == "2":
fun2()
elif c == "q":
exit()
else:
print "您所輸入的不是1或2或q。"程式一開始印出作業系統型態與Python版本,然後進入「while True」迴圈,如果使用者鍵入1,程式跳到函數fun1印出「這是『選單一』。」,鍵入2則是跳到函數fun2印出「這是『選單二』。」,鍵入q則執行函數exit()結束程式,若非鍵入以上三個選項,就會印出「您所輸入的不是1或2或q。」
只有鍵入q執行函數exit()結束程式,「while True」迴圈也隨之結束,不然程式就會一直繼續下去。

有關sys模組的詳細資訊,詳情可參考Python Library Reference的sys。
os
os模組提供了許多作業系統的服務,而且符合程式跨平台的需求。這裡,我們只引入函數system()改寫上面選單的例子。函數system()需要一個參數,其型態為字串,用來執行作業系統的指令。
Windows系統的命令列可用指令cls來清除螢幕,並將游標移到終端機視窗的最上面,在UNIX系統,包括Mac與Linux則是利用指令clear來達到相同目的。因此我們利用sys模組的platform變數做平台檢查,另外寫一個函數clear(),若是平台為Windows則回傳字串“cls”,而平台為Mac與Linux則回傳字串“clear”。
我們直接以clear()作為system()的參數,原本的「while True」迴圈改寫到函數main()之中,然後在main()、fun1()、fun2()開始時都呼叫system(clear()),以達到清除螢幕的效果。
程式碼如下。
#《電腦做什麼事》的範例程式碼 http://pydoing.blogspot.com/
#-*- coding: UTF-8 -*-
from sys import exit, platform, version
from os import system
def whatplatform():
if platform == "win32":
print "您所使用的是MS-Windows作業系統。"
elif platform == "linux2":
print "您所使用的是Linux作業系統。"
elif platform == "darwin":
print "您所使用的是Mac作業系統。"
else:
print "程式未能偵測到您所使用的作業系統種類。"
def clear():
if platform == "win32":
return "cls"
elif platform == "linux2" or "darwin":
return "clear"
else:
return False
def fun1():
try:
system(clear())
print "這是「選單一」。"
raw_input("請按<Enter>繼續。")
except TypeError:
print "系統並無清除螢幕的指令,程式仍繼續運作......."
print "這是「選單一」。"
raw_input("請按<Enter>繼續。")
def fun2():
try:
system(clear())
print "這是「選單二」。"
raw_input("請按<Enter>繼續。")
except TypeError:
print "系統並無清除螢幕的指令,程式仍繼續運作......."
print "這是「選單二」。"
raw_input("請按<Enter>繼續。")
def main():
while True:
try:
system(clear())
print "(1) 選單一......"
print "(2) 選單二......"
c = raw_input("請輸入選擇,或按q離開程式: ")
if c == "1":
fun1()
elif c == "2":
fun2()
elif c == "q":
exit()
else:
print "您所輸入的不是1或2或q。"
raw_input("請按<Enter>繼續。")
except TypeError:
print "系統並無清除螢幕的指令,程式仍繼續運作......."
print "(1) 選單一......"
print "(2) 選單二......"
c = raw_input("請輸入選擇,或按q離開程式: ")
if c == "1":
fun1()
elif c == "2":
fun2()
elif c == "q":
exit()
else:
print "您所輸入的不是1或2或q。"
raw_input("請按<Enter>繼續。")
if __name__ == "__main__":
whatplatform()
print "您的Python版本為", version[:5]
print
raw_input("請按<Enter>繼續。")
main()我們來看看程式在Windows執行的結果。

接著按Eenter。

進入了主選單,接著按入數字「1」,進入選單一。

按下Enter,然後回到了主選單。假如我們輸入的是其他的字母呢?

程式只接受數字「1」、「2」或字母「q」的輸入。
有關os模組的詳細資訊,詳情可參考Python Library Reference的os。
random
random模組則提供產生擬隨機數的函數供我們運用,我們引入其中的函數randint()來寫一個猜數字遊戲。
#《電腦做什麼事》的範例程式碼 http://pydoing.blogspot.com/
#-*- coding: UTF-8 -*-
from random import randint
answer = randint(1,99)
if __name__ == "__main__":
print "**猜數字遊戲**"
print
state = True
while state:
try:
guess = int(raw_input("請輸入1到99的數字: "))
if guess == answer:
print
print "正確答案!"
print
state = False
elif answer < guess < 100:
print "太大囉!再試一次。"
elif 0 < guess < answer:
print "太小囉!再試一次。"
else:
raise ValueError
except ValueError:
print "請不要輸入小於1或大於99的整數,或是除了整數以外的符號。"
raw_input("請按<Enter>來結束視窗。")函數randint()需要兩個整數型態的參數,然後隨機傳回介於之間的一個整數,因此當我們希望被猜的數字介於1到99之間時,就可以將參數分別設為1和99,並且將其存入變數answer之中。
我們仍是利用「while True」迴圈來進行遊戲,變數state控制迴圈是否繼續進行。若是使用者輸入的並非整數,函數int()便會引發ValueError,所以這裡我們仍是用try…except…來處理這項例外。
使用者所猜的數字存入變數guess之中,若是與answer相同,印出「正確答案!」,變數state轉為False,遊戲也隨之結束,若是大於answer且小於100,或小於answer且大於0,分別印出提示訊息。而若是使用者輸入非預期的數字,小於1或大於99,程式自動引發VallueError。
我們來玩玩看吧!

有關random模組的詳細資訊,詳情可參考Python Library Reference的random。