模块
在 Python 中,模块(module)是包含在一个更大程序中的类似的部分。每个模块或部分都是硬盘上的一个单独的文件。可以把一个大程序分解为多个模块或文件。或者也可以反过来,从一个小的模块开始,逐渐增加其他部分来建立一个大程序。
积木桶
我们说过函数就像积木,那么模块可以认为是一桶积木。根据需要,你可以从一个桶中取很多或者很少的积木,也可以有很多桶不同的积木。也许有一桶正方形积木,一桶长方形积木,还有一桶奇形怪状的积木。程序员通常也采用这种方法来使用模块,也就是说,他们会把类似的函数收集在一个模块中。或者他们也有可能把一个项目需要的所有函数收集在一个模块中,就像你会把搭城堡需要的所有积木都放在一个桶中一样。

什么是模块
模块就是某个东西的一部分。如果一个东西可以分为几部分,或者你可以很容易地把它分解成多个不同部分,我们就说这个东西是模块化的。乐高(LEGO)积木可能就是模块化最好的例子。可以拿一堆不同的积木,用它们搭建不同的东西。
为什么使用模块
为什么要那么麻烦地把程序分解为较小的部分呢?要知道我们需要所有这些部分才能让程序正常工作。为什么不直接把所有内容都放在一个大文件中呢?
- 这样做文件会更小,因而就能更容易地查找代码。
- 一旦创建模块,这个模块就能在很多程序中使用。这样下一次需要相同的功能时就不必再从头开始了。
- 并不是所有模块都要使用。模块化意味着你可以使用各部分的不同组合来完成不同的任务,就像利用同样的一组乐高积木可以搭建不同的东西一样。
创建模块
模块就是一个 Python 文件,
# this is the file "my_module.py"# we're going to use it in another programdef c_to_f(celsius):fahrenheit = celsius * 9.0 / 5 + 32return fahrenheit
就这么简单!这样就创建了一个模块!模块中只有一个函数,也就是 c_to_f() 函数,它会把温度从摄氏度转换为华氏度。
使用模块
要使用模块中的某个函数,首先必须告诉 Python 我们想要使用哪些模块。在程序中包含其他模块的 Python 关键字是 import。可以这样使用:import my_module
import my_ module #my_module包含 c_to_f() 函数celsius = float(input("Enter a temperature in Celsius: "))fahrenheit = my_module.c_to_f(celsius)print("That's %.1f degrees Fahrenheit" % fahrenheit)
命名空间
假设在你们学校,你在 Morton 老师的班里,班里有个学生名叫 Shawn。现在 Wheeler 老师教的那个班也有一个名叫 Shawn 的学生。如果你在自己的班里说“Shawn 有一个新书包”时,你们班的所有人都会知道(或者至少他们会认为),你指的是你们班的 Shawn。如果你想说另外那个班的 Shawn 就会说“Wheeler 老师班里的 Shawn”或者“另外那个 Shawn”,或者其他类似的说法。
你们班里只有一个 Shawn,所以你说 Shawn 时,同班的同学就会知道你说的是哪个人。换种说法来讲,在你们班的这个空间里,只有一个名字 Shawn。你们班就是你的命名空间,在这个命名空间里只有一个 Shawn,所以不会有混淆。


import my_modulefrom my_module import *from my_module import c_to_f
标准模块
Python 提供了大量标准模块,可以用来完成很多工作,比如查找文件、报时(或计时)、生成随机数,以及很多其他功能。有时,人们说 Python “配有电池”,指的就是 Python 的所有标准模块。这称为 Python 标准库。
time
利用 time 模块,能够获取你的计算机时钟的信息,如日期和时间。还可以利用它为程序增加延迟。(有时计算机动作太快,你必须让它慢下来。)
time 模块中的 sleep() 函数可以用来增加一个延迟,也就是说,可以让程序等待一段时间,什么也不做。这就像让你的程序睡眠,正是这个原因,这个函数名叫 sleep()。可以告诉它你要它睡多长时间(多少秒)。
import timeprint('How ')time.sleep(2)print('are ')time.sleep(2)print('you ')time.sleep(2)print('today?')
random
random 模块用于生成随机数。这在游戏和仿真中非常有用。
>>> import random>>> print(random.randint(0, 100))4>>> print(random.randint(0, 100))72>>> print(random.random())0.270985467261>>> print(random.random())0.569236541309>>> print(random.random() * 10)3.61204895736>>> print(random.random() * 10)8.10985427783
revision
- 什么是模块。
- 如何创建模块。
- 如何在另一个程序中使用模块。
- 什么是命名空间。
- 局部和全局命名空间和变量是什么意思。
- 如何把其他模块中的名字包含到你的命名空间中。
- 几个 Python 标准模块
测试题
- 使用模块有哪些好处?
- 如何创建模块?
- 使用模块时所用的 Python 关键字是什么?
- 导入模块等同于导入一个_?
- 要导入
time模块从而能访问这个模块中的所有名字(也就是所有变量、函数和对象),有哪两种方法?
动手试一试
- 编写一个模块,包含“用大写字母打印名字”函数。然后编写一个程序导入这个模块,并调用这个函数。
修改代码,把
c_to_f()包含到主程序的命名空间里。也就是说,修改这个代码,从而可以写:fahrenheit = c_to_f(celsius)fahrenheit = my_module.c_to_f(celsius)
编写一个小程序,生成 1 到 20 之间的 5 个随机整数的列表,并打印出来。
- 编写一个小程序,要求它工作 30 秒,每 3 秒打印一个随机小数。
包(Package)
包是一种管理 Python 模块命名空间的形式,采用”点模块名称”。 创建包分为三个步骤:
- 创建一个文件夹,用于存放相关的模块,文件夹的名字即包的名字。
- 在文件夹中创建一个
__init__.py的模块文件,内容可以为空。 - 将相关的模块放入文件夹中。
不妨假设创建一套统一处理声音文件和数据的模块(或者称之为一个”包”)。 现存很多种不同的音频文件格式(基本上都是通过后缀名区分的,例如: .wav,.aiff,.au),所以需要有一组不断增加的模块,用来在不同的格式之间转换。
并且针对这些音频数据,还有很多不同的操作(比如混音,添加回声,增加均衡器功能,创建人造立体声效果),所以还需要一组怎么也写不完的模块来处理这些操作。
这里给出了一种可能的包结构(在分层的文件系统中):
sound/ 顶层包__init__.py 初始化 sound 包formats/ 文件格式转换子包__init__.pywavread.pywavwrite.pyaiffread.pyaiffwrite.pyauread.pyauwrite.py...effects/ 声音效果子包__init__.pyecho.pysurround.pyreverse.py...filters/ filters 子包__init__.pyequalizer.pyvocoder.pykaraoke.py
在导入一个包的时候,Python 会根据 sys.path 中的目录来寻找这个包中包含的子目录。
