模块

在 Python 中,模块(module)是包含在一个更大程序中的类似的部分。每个模块或部分都是硬盘上的一个单独的文件。可以把一个大程序分解为多个模块或文件。或者也可以反过来,从一个小的模块开始,逐渐增加其他部分来建立一个大程序。

积木桶

我们说过函数就像积木,那么模块可以认为是一桶积木。根据需要,你可以从一个桶中取很多或者很少的积木,也可以有很多桶不同的积木。也许有一桶正方形积木,一桶长方形积木,还有一桶奇形怪状的积木。程序员通常也采用这种方法来使用模块,也就是说,他们会把类似的函数收集在一个模块中。或者他们也有可能把一个项目需要的所有函数收集在一个模块中,就像你会把搭城堡需要的所有积木都放在一个桶中一样。

image.png

什么是模块

模块就是某个东西的一部分。如果一个东西可以分为几部分,或者你可以很容易地把它分解成多个不同部分,我们就说这个东西是模块化的。乐高(LEGO)积木可能就是模块化最好的例子。可以拿一堆不同的积木,用它们搭建不同的东西。

为什么使用模块

为什么要那么麻烦地把程序分解为较小的部分呢?要知道我们需要所有这些部分才能让程序正常工作。为什么不直接把所有内容都放在一个大文件中呢?

  • 这样做文件会更小,因而就能更容易地查找代码。
  • 一旦创建模块,这个模块就能在很多程序中使用。这样下一次需要相同的功能时就不必再从头开始了。
  • 并不是所有模块都要使用。模块化意味着你可以使用各部分的不同组合来完成不同的任务,就像利用同样的一组乐高积木可以搭建不同的东西一样。

创建模块

模块就是一个 Python 文件,

  1. # this is the file "my_module.py"
  2. # we're going to use it in another program
  3. def c_to_f(celsius):
  4. fahrenheit = celsius * 9.0 / 5 + 32
  5. return fahrenheit

就这么简单!这样就创建了一个模块!模块中只有一个函数,也就是 c_to_f() 函数,它会把温度从摄氏度转换为华氏度。

使用模块

要使用模块中的某个函数,首先必须告诉 Python 我们想要使用哪些模块。在程序中包含其他模块的 Python 关键字是 import。可以这样使用:import my_module

  1. import my_ module #my_module包含 c_to_f() 函数
  2. celsius = float(input("Enter a temperature in Celsius: "))
  3. fahrenheit = my_module.c_to_f(celsius)
  4. print("That's %.1f degrees Fahrenheit" % fahrenheit)

命名空间

假设在你们学校,你在 Morton 老师的班里,班里有个学生名叫 Shawn。现在 Wheeler 老师教的那个班也有一个名叫 Shawn 的学生。如果你在自己的班里说“Shawn 有一个新书包”时,你们班的所有人都会知道(或者至少他们会认为),你指的是你们班的 Shawn。如果你想说另外那个班的 Shawn 就会说“Wheeler 老师班里的 Shawn”或者“另外那个 Shawn”,或者其他类似的说法。

你们班里只有一个 Shawn,所以你说 Shawn 时,同班的同学就会知道你说的是哪个人。换种说法来讲,在你们班的这个空间里,只有一个名字 Shawn。你们班就是你的命名空间,在这个命名空间里只有一个 Shawn,所以不会有混淆。

image.png

image.png

  1. import my_module
  2. from my_module import *
  3. from my_module import c_to_f

标准模块

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

time

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

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

  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?')

random

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

  1. >>> import random
  2. >>> print(random.randint(0, 100))
  3. 4
  4. >>> print(random.randint(0, 100))
  5. 72
  6. >>> print(random.random())
  7. 0.270985467261
  8. >>> print(random.random())
  9. 0.569236541309
  10. >>> print(random.random() * 10)
  11. 3.61204895736
  12. >>> print(random.random() * 10)
  13. 8.10985427783

revision

  • 什么是模块。
  • ˆˆ如何创建模块。
  • ˆˆ如何在另一个程序中使用模块。
  • ˆˆ什么是命名空间。
  • ˆˆ局部和全局命名空间和变量是什么意思。
  • 如何把其他模块中的名字包含到你的命名空间中。
  • 几个 Python 标准模块

测试题

  1. 使用模块有哪些好处?
  2. 如何创建模块?
  3. 使用模块时所用的 Python 关键字是什么?
  4. 导入模块等同于导入一个_?
  5. 要导入 time 模块从而能访问这个模块中的所有名字(也就是所有变量、函数和对象),有哪两种方法?

动手试一试

  1. 编写一个模块,包含“用大写字母打印名字”函数。然后编写一个程序导入这个模块,并调用这个函数。
  2. 修改代码,把 c_to_f() 包含到主程序的命名空间里。也就是说,修改这个代码,从而可以写:

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

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

包(Package)

包是一种管理 Python 模块命名空间的形式,采用”点模块名称”。 创建包分为三个步骤:

  1. 创建一个文件夹,用于存放相关的模块,文件夹的名字即包的名字。
  2. 在文件夹中创建一个 __init__.py 的模块文件,内容可以为空。
  3. 将相关的模块放入文件夹中。

不妨假设创建一套统一处理声音文件和数据的模块(或者称之为一个”包”)。 现存很多种不同的音频文件格式(基本上都是通过后缀名区分的,例如: .wav,.aiff,.au),所以需要有一组不断增加的模块,用来在不同的格式之间转换。

并且针对这些音频数据,还有很多不同的操作(比如混音,添加回声,增加均衡器功能,创建人造立体声效果),所以还需要一组怎么也写不完的模块来处理这些操作。

这里给出了一种可能的包结构(在分层的文件系统中):

  1. sound/ 顶层包
  2. __init__.py 初始化 sound
  3. formats/ 文件格式转换子包
  4. __init__.py
  5. wavread.py
  6. wavwrite.py
  7. aiffread.py
  8. aiffwrite.py
  9. auread.py
  10. auwrite.py
  11. ...
  12. effects/ 声音效果子包
  13. __init__.py
  14. echo.py
  15. surround.py
  16. reverse.py
  17. ...
  18. filters/ filters 子包
  19. __init__.py
  20. equalizer.py
  21. vocoder.py
  22. karaoke.py

在导入一个包的时候,Python 会根据 sys.path 中的目录来寻找这个包中包含的子目录。