模块
在 Python 中,模块(module)是包含在一个更大程序中的类似的部分。每个模块或部分都是硬盘上的一个单独的文件。可以把一个大程序分解为多个模块或文件。或者也可以反过来,从一个小的模块开始,逐渐增加其他部分来建立一个大程序。
积木桶
我们说过函数就像积木,那么模块可以认为是一桶积木。根据需要,你可以从一个桶中取很多或者很少的积木,也可以有很多桶不同的积木。也许有一桶正方形积木,一桶长方形积木,还有一桶奇形怪状的积木。程序员通常也采用这种方法来使用模块,也就是说,他们会把类似的函数收集在一个模块中。或者他们也有可能把一个项目需要的所有函数收集在一个模块中,就像你会把搭城堡需要的所有积木都放在一个桶中一样。
什么是模块
模块就是某个东西的一部分。如果一个东西可以分为几部分,或者你可以很容易地把它分解成多个不同部分,我们就说这个东西是模块化的。乐高(LEGO)积木可能就是模块化最好的例子。可以拿一堆不同的积木,用它们搭建不同的东西。
为什么使用模块
为什么要那么麻烦地把程序分解为较小的部分呢?要知道我们需要所有这些部分才能让程序正常工作。为什么不直接把所有内容都放在一个大文件中呢?
- 这样做文件会更小,因而就能更容易地查找代码。
- 一旦创建模块,这个模块就能在很多程序中使用。这样下一次需要相同的功能时就不必再从头开始了。
- 并不是所有模块都要使用。模块化意味着你可以使用各部分的不同组合来完成不同的任务,就像利用同样的一组乐高积木可以搭建不同的东西一样。
创建模块
模块就是一个 Python 文件,
# this is the file "my_module.py"
# we're going to use it in another program
def c_to_f(celsius):
fahrenheit = celsius * 9.0 / 5 + 32
return 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_module
from my_module import *
from my_module import c_to_f
标准模块
Python 提供了大量标准模块,可以用来完成很多工作,比如查找文件、报时(或计时)、生成随机数,以及很多其他功能。有时,人们说 Python “配有电池”,指的就是 Python 的所有标准模块。这称为 Python 标准库。
time
利用 time
模块,能够获取你的计算机时钟的信息,如日期和时间。还可以利用它为程序增加延迟。(有时计算机动作太快,你必须让它慢下来。)
time
模块中的 sleep()
函数可以用来增加一个延迟,也就是说,可以让程序等待一段时间,什么也不做。这就像让你的程序睡眠,正是这个原因,这个函数名叫 sleep()
。可以告诉它你要它睡多长时间(多少秒)。
import time
print('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__.py
wavread.py
wavwrite.py
aiffread.py
aiffwrite.py
auread.py
auwrite.py
...
effects/ 声音效果子包
__init__.py
echo.py
surround.py
reverse.py
...
filters/ filters 子包
__init__.py
equalizer.py
vocoder.py
karaoke.py
在导入一个包的时候,Python 会根据 sys.path
中的目录来寻找这个包中包含的子目录。