我们已经知道了如何创建和使用模块,是不是总是必须编写我们自己的模块?并不是这样!这正是 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 标准模块的例子。  
测试题  
 - 使用模块有哪些好处?   
- 如何创建模块?   
- 使用模块时所用的 Python 关键字是什么?   
- 导入模块等同于导入一个__________。   
- 要导入 time 模块从而能访问这个模块中的所有名字(也就是所有变量、函数和对象),有哪两种方法?   
动手试一试  
 - 编写一个模块,包含第 13 章“动手试一试”中的“用大写字母打印名字”函数。然后编写一个程序导入这个模块,并调用这个函数。   
- 修改代码清单 15-2 中的代码,把 c_to_f 包含到主程序的命名空间里。也就是说,修改这个代码,从而可以写:   - fahrenheit = c_to_f(celsius) - 而不是   - fahrenheit = my_module.c_to_f(celsius) 
- 编写一个小程序,生成 1 到 20 之间的 5 个随机整数的列表,并打印出来。   
- 编写一个小程序,要求它工作 30 秒,每 3 秒打印一个随机小数。