讀古今文學網 > 父與子的編程之旅:與小卡特一起學Python > 15.7 標準模塊 >

15.7 標準模塊

我們已經知道了如何創建和使用模塊,是不是總是必須編寫我們自己的模塊?並不是這樣!這正是 Python 的妙處之一。

Python 提供了大量標準模塊,可以用來完成很多工作,比如查找文件、報時(或計時)、生成隨機數,以及很多其他功能。有時,人們說 Python「配有電池」,指的就是 Python 的所有標準模塊。這稱為 Python 標準庫。

為什麼這些內容必須放在單獨的模塊中呢?嗯,不是非得這樣,不過設計 Python 的人認為這樣會更高效。否則,每個 Python 程序都必須包含所有可能用到的函數。通過建立單獨的模塊,就只需包含你真正需要的那些函數。

當然,有些內容(如 printforif-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 秒打印一個隨機小數。