1. 什么是模块
模块就是某个东西的一部分。如果一个东西可以分为几部分,或者你可以很容易地把它分解成多个不同的部分,我们就说这个东西是模块化的。
在Python中,模块是包含在一个更大的程序中的类似部分。每个程序或部分都是硬盘上的一个单独的文件。可以把一个大程序分解为多个模块或文件。或者也可以反过来,从一个小模块开始,逐渐增加其他部分来建立一个大程序。
2. 为什么使用模块
为什么要那么麻烦地把程序分解为较小的部分呢?原因有几个:
- 这样做文件会更小,因而就能更容易地查找代码。
- 一旦创建模块,这个模块就能在很多程序中使用。这样下一次需要相同的功能时就不必再从头开始了。
3. 如何创建模块
键入:
def c_to_f(celsius):
faherheit = celsius * 9.0 /5 + 32
return faherheit
这就创建好一个模块,这个模块中只有一个函数,作用是把摄氏度转化为华氏度,把它保存为my_module.py。
4. 如何使用模块
要使用模块中的某个函数,首先必须告诉Python我们想要使用哪些模块:
import my_module
下面写一个程序来使用我们刚才编写的模块这里我们使用c_co_f( )函数完成温度转换。
前面我们已经知道如何使用函数并向它传递参数。这里唯一不同的是,函数与主程序不在同一个文件中,而在另一个单独的文件中,所以必须使用import。创建一个新的编译器窗口,键入:
import my_module
celsius = float(raw_input("Enter a temperature in Celsius: "))
fahrenheit = c_to_f(celsius)
print "That's ",fahrenheit,"degree Fahrenheit"
保存为 modular.py,然后运行,结果可能是这样的:
Enter a temperature in Celsius: 22
Traceback (most recent call last):
File "F:\Python文件\111.py", line 4, in <module>
fahrenheit = c_to_f(celsius)
NameError: name 'c_to_f' is not defined
为什么不能正常运行呢?错误的原因是c_to_f( )没有定义。但是我们前边已经在my_module中定义了这个函数,而且我们去确定已经导入了这个模块。
出现这个问题的原因是,在Python中指定去他模块中定义的函数时必须更加具体,改为:
fahreheit = my_module.c_to_f(celsius)
运行即可正常工作。
5. 命名空间
什么是命名空间
拿我自己举例子。我们高中学校一共有包括我在内两个人的名字是YMY,但我在高一(3)班,另一个人高一(4)班。假如有人在我们班级讲YMY今天穿的黄色衣服,我们班所有人都会认为在说我;如果想说另一个YMY,就会说:“(4)班的YMY穿的黄色衣服。”或者“另外那个YMY”,或者其他类似说法。
因为我们班只有一个YMY,所以提到这个名字,班级同学就会知道说的哪个人。换一种说法,在我们班这个空间,只有一个名字YMY。我们班就是我的命名空间,在这个命名空间只有一个YMY,所以不会混淆。
现在校长必须通过学校的广播把YMY叫到办公室,他一定不会说:“请YMY到办公室来一趟”。如果这样,两个YMY都会出现在他的办公室。对于使用广播的校长来说,命名空间是整个学校。这证明,学校的每个人都会听到这个名字,而不是一个班的同学。所以他必须指出是哪个YMY,即必须说:“高一(3)班的YMY到办公室来一趟。”
校长还可以用另一个办法找YMY,就是走到我们班门口说:“YMY,请跟我来。”这里就只有一个YMY听到。这种情况下,命名空间只是一个教室,而不是整个学校。
一般来讲,把较小的空间(比如我的教室)称作局部命名空间,而较大的命名空间(如整个学校)称为全局命名空间。
6. 标准模块
Python提供了大量标准模块,可以用来完成很多工作,比如查找文件、报时、生成随机数等,称为Python标准库。
为什么这些内容必须放在模块中呢?恩,其实不是非得这样,不过设计Python的人认为这样更高效。通过建立单独的模块,就只需要包含你需要的那些函数。
当然,有些内容(如print、for和if-else) 是Python的基本命令。所以这些命令不需要一个单独的模块,它们都在Python的主要部分中。
下边介绍几个标准模块:
time
time模块,能过获取计算机时钟的信息,如日期和时间。还可以利用它为程序增加延迟。
time模块中的sleep( )函数可以用来增加一个延迟,里边的参数表示延迟多少秒,具体如何工作如下例:
import time
print "L",
time.sleep(2)
print "S",
time.sleep(2)
print "M"
要注意,调用sleep( )函数时,必须在前边加上time.。这是因为,尽管我们已经导入了time,但并没有让它成为主程序命名空间的一部分,所以要在使用sleep( )函数时,都必须强调time.sleep( )。
如果这样:
import time
sleep(5)
会出现这样的错误:
Traceback (most recent call last):
File "F:\Python文件\111.py", line 2, in <module>
sleep(5)
NameError: name 'sleep' is not defined
不过如果这样导入:
from time import sleep
就会告诉Python,“在time模块中寻找名为sleep的变量(或者函数或对象),把它包含在我的命名空间中。”就可以直接使用sleep函数,而不用在前面加上time.了。
from time import sleep
print "Hello,talk to you again in 5 seconds..."
sleep(5)
print "Hi again"
也可以一劳永逸使用 * 表示“全部”,这样就会从模块导入所有可用的名字。
from time import *
使用这个命令必须特别当心。如果我们在程序中创建了一个名字,而它与time模块中的一个名字相同,就会出现冲突。最好还是导入真正需要的部分。
随机数
random用于生成随机数。这在游戏和仿真中非常有用。
在交互模式中使用random模块:
>>> import random
>>> print random.randint(0,100)
84
>>> print random.randint(0,100)
35
每次使用random.randint( )时,会得到一个新的随机整数,当然是介于0~100之间的数。
如果想得到一个随机小数,可以使用random.random( )。不在括号中放任何参数,因为random.random( )总会提供一个介于0到1之间的数:
>>> print random.random()
0.470544754742
>>> print random.random()
0.83671155848
如果想得到一个0到10之间的小数,只需要将结果乘以10:
>>> print random.random() * 10
5.47524865327
>>> print random.random() * 10
9.36458929356
小练习
1.编写一个模块,包含Python——函数中“用大写字母打印名字”函数,然后编写一个程序导入模块中,并调用这个函数。
def printName():
print "L SSSS M M"
print "L S M M M M"
print "L S M M M M"
print "L SSSSS M M M M"
print "L S M M M M"
print "L S M M M M"
print "LLLLL SSSS M M M"
print
for i in range(5):
printName()
将这个程序保存为“printLSM.py”,然后新建一个模块:
import printLSM
printLSM.printName()
2.编写一个小程序,生成1到20之间的5个随机整数列表,并打印出来。
import random
for i in range(5):
print random.randint(0,20)
3.编写一个小程序,要求它工作30秒,每三秒打印一个随机小数。
import time,random
for i in range(10):
time.sleep(3)
print random.random()