之前跟大家讲的是一些 python 的数据基础, 从这篇文章开始, 我们开始正式学习 python 的模块化编程
下面我们解释一下什么叫做模块
之前已经讲过怎么去定义一个方法, 如果你是用 python 交互器 (自带交互器, 或者是 ipython) 来学习定义方法的话, 你定义完方法后, 然后退出交互器, 然后你再来使用这个方法, 很显然, 是不会成功调用的, 这是因为 python 交互器在你退出后, 会清空内存, 所有定义的变量和方法都会被清理
如果你想把定义好的方法用在你的新脚本文件中, 这样就必须引入一种模块机制
你可以把你写好的 python 代码保存到一个文件中(当然是以 ".py" 结尾的文件), 那么这样你就可以长久的使用这个代码中的方法和变量
一个新文件想要使用之前保存好的文件的方法, 就必须通过 import 方法导入这个文件
import
import 的方法是用来做模块导入的, 他主要有以下几种使用形式
导入整个模块
- In [1]: import sys
- In [2]: sys.path
- Out[2]:
- ['','D:\\Users\\susmote\\Anaconda3\\Scripts','D:\\Users\\susmote\\Anaconda3\\python36.zip','D:\\Users\\susmote\\Anaconda3\\DLLs','D:\\Users\\susmote\\Anaconda3\\lib','D:\\Users\\susmote\\Anaconda3','D:\\Users\\susmote\\Anaconda3\\lib\\site-packages','D:\\Users\\susmote\\Anaconda3\\lib\\site-packages\\Babel-2.5.0-py3.6.egg','D:\\Users\\susmote\\Anaconda3\\lib\\site-packages\\win32','D:\\Users\\susmote\\Anaconda3\\lib\\site-packages\\win32\\lib','D:\\Users\\susmote\\Anaconda3\\lib\\site-packages\\Pythonwin','D:\\Users\\susmote\\Anaconda3\\lib\\site-packages\\IPython\\extensions','C:\\Users\\susmote\\.ipython']
导入模块中的某个方法
- In [1]: from sys import path
- In [2]: path
- Out[2]:
- ['','D:\\Users\\susmote\\Anaconda3\\Scripts','D:\\Users\\susmote\\Anaconda3\\python36.zip','D:\\Users\\susmote\\Anaconda3\\DLLs','D:\\Users\\susmote\\Anaconda3\\lib','D:\\Users\\susmote\\Anaconda3','D:\\Users\\susmote\\Anaconda3\\lib\\site-packages','D:\\Users\\susmote\\Anaconda3\\lib\\site-packages\\Babel-2.5.0-py3.6.egg','D:\\Users\\susmote\\Anaconda3\\lib\\site-packages\\win32','D:\\Users\\susmote\\Anaconda3\\lib\\site-packages\\win32\\lib','D:\\Users\\susmote\\Anaconda3\\lib\\site-packages\\Pythonwin','D:\\Users\\susmote\\Anaconda3\\lib\\site-packages\\IPython\\extensions','C:\\Users\\susmote\\.ipython']
from 后面接模块名, import 后面接具体的方法, 可以接多个, 用逗号隔开即可
直接导入所有方法
- In [1]: from sys import *
- In [2]: path
- Out[2]:
- ['','D:\\Users\\susmote\\Anaconda3\\Scripts','D:\\Users\\susmote\\Anaconda3\\python36.zip','D:\\Users\\susmote\\Anaconda3\\DLLs','D:\\Users\\susmote\\Anaconda3\\lib','D:\\Users\\susmote\\Anaconda3','D:\\Users\\susmote\\Anaconda3\\lib\\site-packages','D:\\Users\\susmote\\Anaconda3\\lib\\site-packages\\Babel-2.5.0-py3.6.egg','D:\\Users\\susmote\\Anaconda3\\lib\\site-packages\\win32','D:\\Users\\susmote\\Anaconda3\\lib\\site-packages\\win32\\lib','D:\\Users\\susmote\\Anaconda3\\lib\\site-packages\\Pythonwin','D:\\Users\\susmote\\Anaconda3\\lib\\site-packages\\IPython\\extensions','C:\\Users\\susmote\\.ipython']
上面的使用根据具体情况而定
自己定义模块
之前在讲定义方法的时候讲到了斐波那契数列, 这一次, 我们还是用他做例子
首先在文本编辑器中写下这几段代码
保存为 fibo.py
然后我们继续在这个目录打开 python 交互器
- In [1]: import fibo
- In [2]: fibo.fib(200)
- 0 1 1 2 3 5 8 13 21 34 55 89 144
- In [3]: fibo.fib2(200)
- Out[3]: [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144]
可以直接导入之前写好的 python 代码, 调用里面写好的方法
__name__变量
__name__是一个系统变量, 他可以显示当前函数执行过程中的名称
简单来说__name__就是全局的模块名称
例如上面那个例子
- In [1]: import fibo
- In [2]: fibo.fib(200)
- 0 1 1 2 3 5 8 13 21 34 55 89 144
- In [3]: fibo.fib2(200)
- Out[3]: [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144]
- In [4]: fibo.__name__
- Out[4]: 'fibo'
在后面我们会经常用到这样一个表达式
if __name__ = __main__:
全局代码都写在这行代码的后面, 也就是说, 在执行代码的时候会首先判断是不是在本地执行的, 简单来说, 他保证了你的代码只能在你的文件中运行
模块路径更改
接下来我们要讲到的这个就非常重要了, 在之前我们添加的 python 文件和导入模块都是在同一个目录进行的, 所以会成功执行
但是如果我们要导入其他路径的 python 文件, 这就有点麻烦了
首先我们要熟悉一个命令
- In [1]: import sys
- In [2]: sys.path
- Out[2]:
- ['','D:\\Users\\susmote\\Anaconda3\\Scripts','D:\\Users\\susmote\\Anaconda3\\python36.zip','D:\\Users\\susmote\\Anaconda3\\DLLs','D:\\Users\\susmote\\Anaconda3\\lib','D:\\Users\\susmote\\Anaconda3','D:\\Users\\susmote\\Anaconda3\\lib\\site-packages','D:\\Users\\susmote\\Anaconda3\\lib\\site-packages\\Babel-2.5.0-py3.6.egg','D:\\Users\\susmote\\Anaconda3\\lib\\site-packages\\win32','D:\\Users\\susmote\\Anaconda3\\lib\\site-packages\\win32\\lib','D:\\Users\\susmote\\Anaconda3\\lib\\site-packages\\Pythonwin','D:\\Users\\susmote\\Anaconda3\\lib\\site-packages\\IPython\\extensions','C:\\Users\\susmote\\.ipython']
之前多次使用过的命令
这个命令会显示所有的 python 模块的位置, 以一个列表返回, 通俗一点来讲, 就是 python 解释器会去这些路径去寻找 python 的文件, 也就每个模块
比如 numpy 这个模块文件的路径
如果我们要添加自己的模块到路径中, 就可以使用 append 方法(前面说过 sys.path 是一个列表)
例如下面这行代码
- In [5]: sys.path.append("E:\\Python-project\\Python-project\\module_study")
- In [6]: sys.path
- Out[6]:
- ['','D:\\Users\\susmote\\Anaconda3\\Scripts','D:\\Users\\susmote\\Anaconda3\\python36.zip','D:\\Users\\susmote\\Anaconda3\\DLLs','D:\\Users\\susmote\\Anaconda3\\lib','D:\\Users\\susmote\\Anaconda3','D:\\Users\\susmote\\Anaconda3\\lib\\site-packages','D:\\Users\\susmote\\Anaconda3\\lib\\site-packages\\Babel-2.5.0-py3.6.egg','D:\\Users\\susmote\\Anaconda3\\lib\\site-packages\\win32','D:\\Users\\susmote\\Anaconda3\\lib\\site-packages\\win32\\lib','D:\\Users\\susmote\\Anaconda3\\lib\\site-packages\\Pythonwin','D:\\Users\\susmote\\Anaconda3\\lib\\site-packages\\IPython\\extensions','C:\\Users\\susmote\\.ipython','E:\\Python-project\\Python-project\\module_study']
注意在输入路径时要注意转义字符, 路径已经成功加入到了列表中了
下面我们测试有没有成功生效, 还是导入我们之前定义的斐波那契数列的代码
首先随便进入一个目录, 比如进入 C 盘
然后再进入 python 交互器
- In [7]: import fibo
- In [8]: fibo.fib(200)
- 0 1 1 2 3 5 8 13 21 34 55 89 144
- In [9]: fibo.fib2(200)
- Out[9]: [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144]
- In [10]: fibo.__name__
- Out[10]: 'fibo'
可以成功导入
关于模块简单的就是这些, 多练才能孰能生巧
官方博客 www.susmote.com
来源: https://www.cnblogs.com/susmote/p/8955083.html