我們已經知道了如何創建和使用模塊,是不是總是必須編寫我們自己的模塊?並不是這樣!這正是 Python 的妙處之一。
Python 提供了大量標準模塊,可以用來完成很多工作,比如查找文件、報時(或計時)、生成隨機數,以及很多其他功能。有時,人們說 Python「配有電池」,指的就是 Python 的所有標準模塊。這稱為 Python 標準庫。
為什麼這些內容必須放在單獨的模塊中呢?嗯,不是非得這樣,不過設計 Python 的人認為這樣會更高效。否則,每個 Python 程序都必須包含所有可能用到的函數。通過建立單獨的模塊,就只需包含你真正需要的那些函數。
當然,有些內容(如 print
、for
和 if-else
)是 Python 的基本命令,所以這些基本命令不需要一個單獨的模塊,它們都在 Python 的主要部分中。
如果 Python 沒有提供合適的模塊來完成你想做的工作(如建立一個圖形遊戲),可以下載另外一些插件模塊,它們通常都是免費的!我們在這本書裡就包含了一些這樣的插件模塊,如果使用這本書網站上的安裝程序,就會同時安裝這些模塊。或者,你也完全可以單獨安裝。下面來看幾個標準模塊。
time
利用 time
模塊,能夠獲取你的計算機時鐘的信息,如日期和時間。還可以利用它為程序增加延遲。(有時計算機動 作太快,你必須讓它慢下來。)
time
模塊中的 sleep
函數可以用來增加一個延遲,也就是說,可以讓程序等待一段時間,什麼也不做。這就像讓你的程序睡眠,正是這個原因,這個函數名叫 sleep
。可以告訴它你要它睡多長時間(多少秒)。
代碼清單 15-3 中的程序展示了 sleep
函數如何工作。鍵入這個程序,保存並運行,看看會發生什麼。
代碼清單 15-3 讓程序睡眠
import timeprint \"How\",time.sleep(2)print \"are\",time.sleep(2)print \"you\",time.sleep(2)print \"today?\"
要注意,調用 sleep
函數時,必須在前面加上 time.
。這是因為,儘管我們已經用 import
導入了 time
,但是並沒有讓它成為主程序命名空間的一部分。所以每次想要使用 sleep
函數時,都必須調用 time.sleep
。
如果試圖這樣做:
import timesleep(5)
這是不行的,因為 sleep
並不在我們的命名空間中。我們會得到這樣一條錯誤消息:
NameError: name \'sleep\' is not defined
不過如果這樣導入:
from time import sleep
就會告訴 Python,「在 time
模塊中尋找名為 sleep
的變量(或者函數或對像),把它包含到我的命名空間中。」現在就可以直接使用 sleep
函數,而不需要再在前面加上 time.
了:
from time import sleepprint \'Hello, talk to you again in 5 seconds...\'sleep(5)print \'Hi again\'
如果想要得到這種將名字導入局部命名空間帶來的方便(這樣就無需每次都指定模塊名),但是又不知道需要模塊中的哪些名字,就可以使用星號(*
)把所有名字都導入到我們的命名空間裡:
from time import *
*
表示「全部」,這樣就會從模塊導入所有可用的名字。使用這個命令必須特別當心。如果在我們的程序中創建了一個名字,而它與 time
模塊中的一個名字相同,就會出現衝突。用 *
導入所有名字不是最佳做法,最好只導入你真正需要的部分。
還記得第 8 章代碼清單 8-6 中的倒計時程序嗎?現在你應該知道那個程序中 time.sleep(1)
的作用了吧。
隨機數
random
模塊用於生成隨機數。這在遊戲和仿真中非常有用。
下面試著在交互模式中使用 random
模塊:
>>> import random>>> print random.randint(0, 100)4>>> print random.randint(0, 100)72
每次使用 random.randint
時,會得到一個新的隨機整數。由於我們為它傳遞的參數是 0 和 100,所以得到的整數會介於 0 到 100 之間。我們在第 1 章的猜數程序中就是使用 random.randint
來創建秘密數。
如果你想得到一個隨機的小數,可以使用 random.random
。不用在括號裡放任何參數,因為 random.random
總是會提供一個介於 0 到 1 之間的數:
>>> print random.random0.270985467261>>> print random.random0.569236541309
如果你想得到其他範圍內的一個隨機數,比如說 0 到 10 之間,只需要將結果乘 以 10:
>>> print random.random * 103.61204895736>>> print random.random * 108.10985427783
你學到了什麼
在這一章,你學到了以下內容。
什麼是模塊。
如何創建模塊。
如何在另一個程序中使用模塊。
什麼是命名空間。
局部和全局命名空間和變量是什麼意思。
如何把其他模塊中的名字包含到你的命名空間中。
另外你還瞭解了幾個 Python 標準模塊的例子。
測試題
1. 使用模塊有哪些好處?
2. 如何創建模塊?
3. 使用模塊時所用的 Python 關鍵字是什麼?
4. 導入模塊等同於導入一個__________________。
5. 要導入 time
模塊從而能訪問這個模塊中的所有名字(也就是所有變量、函數和對像),有哪兩種方法?
動手試一試
1. 編寫一個模塊,包含第 13 章「動手試一試」中的「用大寫字母打印名字」函數。然後編寫一個程序導入這個模塊,並調用這個函數。
2. 修改代碼清單 15-2 中的代碼,把 c_to_f
包含到主程序的命名空間裡。也就是說,修改這個代碼,從而可以寫:
fahrenheit = c_to_f(celsius)
而不是
fahrenheit = my_module.c_to_f(celsius)
3. 編寫一個小程序,生成 1 到 20 之間的 5 個隨機整數的列表,並打印出來。
4. 編寫一個小程序,要求它工作 30 秒,每 3 秒打印一個隨機小數。