15.7 标准模块

我们已经知道了如何创建和使用模块,是不是总是必须编写我们自己的模块?并不是这样!这正是 Python 的妙处之一。

Python 提供了大量标准模块,可以用来完成很多工作,比如查找文件、报时(或计时)、生成随机数,以及很多其他功能。有时,人们说 Python“配有电池”,指的就是 Python 的所有标准模块。这称为 Python 标准库。

为什么这些内容必须放在单独的模块中呢?嗯,不是非得这样,不过设计 Python 的人认为这样会更高效。否则,每个 Python 程序都必须包含所有可能用到的函数。通过建立单独的模块,就只需包含你真正需要的那些函数。

当然,有些内容(如 printforif-else)是 Python 的基本命令,所以这些基本命令不需要一个单独的模块,它们都在 Python 的主要部分中。

如果 Python 没有提供合适的模块来完成你想做的工作(如建立一个图形游戏),可以下载另外一些插件模块,它们通常都是免费的!我们在这本书里就包含了一些这样的插件模块,如果使用这本书网站上的安装程序,就会同时安装这些模块。或者,你也完全可以单独安装。下面来看几个标准模块。

time

利用 time 模块,能够获取你的计算机时钟的信息,如日期和时间。还可以利用它为程序增加延迟。(有时计算机动 作太快,你必须让它慢下来。)

{%}

time 模块中的 sleep() 函数可以用来增加一个延迟,也就是说,可以让程序等待一段时间,什么也不做。这就像让你的程序睡眠,正是这个原因,这个函数名叫 sleep()。可以告诉它你要它睡多长时间(多少秒)。

代码清单 15-3 中的程序展示了 sleep() 函数如何工作。键入这个程序,保存并运行,看看会发生什么。

代码清单 15-3 让程序睡眠

  1. import time
  2. print "How",
  3. time.sleep(2)
  4. print "are",
  5. time.sleep(2)
  6. print "you",
  7. time.sleep(2)
  8. print "today?"

要注意,调用 sleep() 函数时,必须在前面加上 time.。这是因为,尽管我们已经用 import 导入了 time,但是并没有让它成为主程序命名空间的一部分。所以每次想要使用 sleep() 函数时,都必须调用 time.sleep()

如果试图这样做:

  1. import time
  2. sleep(5)

这是不行的,因为 sleep() 并不在我们的命名空间中。我们会得到这样一条错误消息:

  1. NameError: name 'sleep' is not defined

不过如果这样导入:

  1. from time import sleep

就会告诉 Python,“在 time 模块中寻找名为 sleep 的变量(或者函数或对象),把它包含到我的命名空间中。”现在就可以直接使用 sleep() 函数,而不需要再在前面加上 time. 了:

  1. from time import sleep
  2. print 'Hello, talk to you again in 5 seconds...'
  3. sleep(5)
  4. print 'Hi again'

如果想要得到这种将名字导入局部命名空间带来的方便(这样就无需每次都指定模块名),但是又不知道需要模块中的哪些名字,就可以使用星号(*)把所有名字都导入到我们的命名空间里:

  1. from time import *

* 表示“全部”,这样就会从模块导入所有可用的名字。使用这个命令必须特别当心。如果在我们的程序中创建了一个名字,而它与 time 模块中的一个名字相同,就会出现冲突。用 * 导入所有名字不是最佳做法,最好只导入你真正需要的部分。

还记得第 8 章代码清单 8-6 中的倒计时程序吗?现在你应该知道那个程序中 time.sleep(1) 的作用了吧。

随机数

random 模块用于生成随机数。这在游戏和仿真中非常有用。

下面试着在交互模式中使用 random 模块:

  1. >>> import random
  2. >>> print random.randint(0, 100)
  3. 4
  4. >>> print random.randint(0, 100)
  5. 72

每次使用 random.randint() 时,会得到一个新的随机整数。由于我们为它传递的参数是 0 和 100,所以得到的整数会介于 0 到 100 之间。我们在第 1 章的猜数程序中就是使用 random.randint() 来创建秘密数。

如果你想得到一个随机的小数,可以使用 random.random()。不用在括号里放任何参数,因为 random.random() 总是会提供一个介于 0 到 1 之间的数:

  1. >>> print random.random()
  2. 0.270985467261
  3. >>> print random.random()
  4. 0.569236541309

如果你想得到其他范围内的一个随机数,比如说 0 到 10 之间,只需要将结果乘 以 10:

  1. >>> print random.random() * 10
  2. 3.61204895736
  3. >>> print random.random() * 10
  4. 8.10985427783

你学到了什么

在这一章,你学到了以下内容。

  • 什么是模块。

  • 如何创建模块。

  • 如何在另一个程序中使用模块。

  • 什么是命名空间。

  • 局部和全局命名空间和变量是什么意思。

  • 如何把其他模块中的名字包含到你的命名空间中。

另外你还了解了几个 Python 标准模块的例子。

测试题

  1. 使用模块有哪些好处?

  2. 如何创建模块?

  3. 使用模块时所用的 Python 关键字是什么?

  4. 导入模块等同于导入一个__

  5. 要导入 time 模块从而能访问这个模块中的所有名字(也就是所有变量、函数和对象),有哪两种方法?

动手试一试

  1. 编写一个模块,包含第 13 章“动手试一试”中的“用大写字母打印名字”函数。然后编写一个程序导入这个模块,并调用这个函数。

  2. 修改代码清单 15-2 中的代码,把 c_to_f() 包含到主程序的命名空间里。也就是说,修改这个代码,从而可以写:

  1. fahrenheit = c_to_f(celsius)

而不是

  1. fahrenheit = my_module.c_to_f(celsius)
  1. 编写一个小程序,生成 1 到 20 之间的 5 个随机整数的列表,并打印出来。

  2. 编写一个小程序,要求它工作 30 秒,每 3 秒打印一个随机小数。