我们已经知道了如何创建和使用模块,是不是总是必须编写我们自己的模块?并不是这样!这正是 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 秒打印一个随机小数。