在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护。
为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式。在Python中,一个.py
文件就称之为一个模块(Module)。
即:
- 包含我们定义的函数以及变量的文件,以“.py”为后缀名。
- 模块可以被其他的程序引用,以使用该模块中的函数或者数据。
模块的优点:
- 1.提高了代码可维护性
- 2.提高了代码的复用性
- 3.可以导入很多功能模块 ( 标准库模块,自定义模块,第三方模块)
4.避免了变量名重复
模块的导入
Python中导入模块的方法的简单形式主要有以下三种:
import 模块名
import模块名 as 新名称
from 模块名 import 函数名
区别:
import 模块名
和import 模块名 as 新名称
- 会导入整个模块;
- 如果需要使用其中的某一个函数,必须以“模块名.函数名()”的形式调用函数。(通常这种方法,更有利于增强代码的可读性,优先推荐使用该种方法)
import 模块名 as 新名称
用来重新命名导入的模块,以使名称简便,方便使用。
from 模块名 import 函数名
- 只是导入模块中的某一函数,而不是导入整个模块。
- 可以直接使用函数名称调用函数,无须再在其前加上“模块名.”。
如果程序语句非常多,我们不建议采用“from 模块名 import 函数名”这种方式,因为采用这种方式调用函数时,我们直接使用函数名称调用函数,当程序语句非常多,我们调用了很多模块后,可能造成函数名重名,引发错误,而“模块名.函数名”的方式则会避免这种情况的发生。
例子:
以Python内建的calendar模块为例,其名称为calendar.py,里面定义了一些日历格式。只要使用import指令导入此模块,就可以使用calendar模块了。
1, 3, 5, 7, 8, 10, 12 --->31天
2月除外,30天
二月:闰年29,平年28
- import ...
>>> import calendar # 导入calendar模块
>>> print(calendar.month(2019,4)) # 调用用模块中的month()函数
April 2019
Mo Tu We Th Fr Sa Su
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
>>> calendar.isleap(2019)
False
- import ... as ...
>>> import calendar as cal
>>> print(cal.month(2019, 4))
April 2019
Mo Tu We Th Fr Sa Su
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
>>> cal.isleap(2019)
False
- from ... import ...
>>> from calendar import month
>>> print(month(2019, 4))
April 2019
Mo Tu We Th Fr Sa Su
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
>>> isleap(2019)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'isleap' is not defined
>>>
注意,
- import 语句的模块顺序:
我们推荐所有的模块在 Python 模块的开头部分导入。 而且最好按照这样的顺序:
- Python 标准库模块
- Python 第三方模块
- 应用程序自定义模块
然后使用一个空行分割这三类模块的导入语句。 这将确保模块使用固定的习惯导入, 有助于减少每个模块需要的 import 语句数目。 其他的提示请参考《 Python 风格指南》(Python’s Style Guide), PEP8 。
- 限制使用 "from module import *"
在实践中, 我们认为 "from module import *" 不是良好的编程风格, 因为它"污染"当前名称空间, 而且很可能覆盖当前名称空间中现有的名字; 但如果某个模块有很多要经常访问的变量或者模块的名字很长, 这也不失为一个方便的好办法。
我们只在两种场合下建议使用这样的方法, 一个场合是:目标模块中的属性非常多, 反复键入模块名很不方便, 例如 Tkinter (Python/Tk) 和 NumPy (Numeric Python) 模块, 可能还有socket 模块。另一个场合是在交互解释器下, 因为这样可以减少输入次数。
模块的路径查看:
模块名.__file__
>>> calendar.__file__
'D:\\Anaconda3\\lib\\calendar.py'
>>>
自定义模块
所谓自定义模块就是我们自己动手写的模块(.py文件),既可以是一个解决某个问题的独立程序也可以包含多个函数。
自定义模块的名称就是我们编写的Python程序的名称。
下面给大家举个例子:
在前面的课程中,我们已经接触过斐波那契数列(Fibonacci),除第一个和第二个数外,任意一个数都可由前两个数相加得到:
1, 1, 2, 3, 5, 8,13, 21, 34, ...
现在我们创建一个名为fibo.py的文件,内容如下:
# 程序名称为fibo.py
# 斐波那契数列模块
def fib_01(n): # 输出最大数小于n的斐波那契数列
i, j = 0, 1
while j < n:
print(j, end = ' ')
i, j = j, i + j
print()
def fib_02(n): # 以列表的形式输出最大数小于n的斐波那契数列
result = []
i, j = 0, 1
while j < n:
result.append(j)
i, j = j, i + j
return result
在当前目录下打开cmd命令窗口。进入Python解释器环境,然后:
>>> import fibo
回车,如果没有报错,恭喜你,已经成功导入这个模块了。但这并不导入fibo中定义的函数的名称,它只进入模块名称fibo。使用模块名称,我们可以访问其中的函数:
>>> import fibo # 导入模块
>>> fibo.fib_01(100) # 调用导入模块的函数
1 1 2 3 5 8 13 21 34 55 89
>>> fibo.fib_02(100) # 调用导入模块的函数
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
>>>
如果接下来,我们会多次使用fib_01函数,我们可以这样做:
>>> fib = fibo.fib_01
>>> fib(100)
1 1 2 3 5 8 13 21 34 55 89
>>> fib(200)
1 1 2 3 5 8 13 21 34 55 89 144
>>> fib(1000)
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
>>>
reload()
reload() 内建函数可以重新导入一个已经导入的模块。 它的语法如下:
import importlib
importlib.reload(module)
module 是你想要重新导入的模块。使用 reload() 的时候有一些标准。 首先模块必须是全部导入(不是使用 from-import), 而且它必须被成功导入。另外 reload() 函数的参数必须是模块自身而不是包含模块名的字符串。 也就是说必须类似 reload(sys) 而不是 reload('sys')。
模块中的代码在导入时被执行, 但只执行一次,以后执行 import 语句不会再次执行这些代码,只是绑定模块名称。 而 reload() 函数不同。
模块搜索路径
前面我们在导入模块时是要求在fibo.py所在路径下打开命令窗口,为什么呢?
一般情况下,Python解释器在运行程序时,在这之前会自动将程序所在的当前目录添加到sys.path路径列表下,然后,优先搜索当前路径下的模块。在Windows系统中,其默认模块搜素路径为Python安装目录及其安装目录下的几个子文件夹,我们可以在python解释器环境下,通过以下方式查看:
>>> import sys # 导入sys模块
>>> print(sys.path) # 输出当前的模块搜索路径,以列表形式显示
['','D:\\Python36\\python36.zip','D:\\Python36\\DLLs','D:\\Python36\\lib', 'D:\\Python36', 'D:\\
python36\\lib\\site-packages']
>>>
如果我们希望不在fibo.py文件所在目录路径下启动cmd命令窗口就可以导入fibo.py模块,我们可以用:
sys.path.append(AddPath)
临时添加fibo.py文件所在目录路径。
现在,打开cmd:
C:\Users\Administrator>python
Python 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 16:07:46) [MSC v.1900 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.path.append('E:\\python')
>>> import fibo
>>> fibo.fib_01(100)
1 1 2 3 5 8 13 21 34 55 89
>>>