这一篇教程,我们来了解包和模块。
一、包
包比较简单,可以理解成为包含模块的文件夹。
不过,并不是只把模块放入文件夹,就形成了包。
在包的目录中,需要添加一个名“__init__.py”的文件,这个文件可以创建一个空的文本文档,修改成这个文件名就可以了。
例如,我们在PyCharm中创建了一个项目,这个项目的所有文件都在同一个文件夹中(D:\MyProject)。
首先,点击文件(File)–新建项目(New Project…)创建新的项目。
然后,选择路径,并填写要创建的文件夹名称,点击确定(OK)保存,继续点击创建(create)按钮进行创建。。
最后,选择打开方式,这里选择的是当前窗口打开。继续点击确定(create)按钮打开项目。
这个时候,在我们创建项目的本地磁盘中就会生成项目的文件夹。
接下来,我们在项目文件夹中创建一个新的文件夹,例如名称为“package”。
然后,在这个文件夹中创建“__init__.py”文件,再放入一个写好代码的py文件(也可以通过文本文档创建),例如“sayhello.py”。
示例代码:(sayhello.py)
def hello(): print('你好!帅帅的小楼!') hello()
完成上面的步骤,回到PyCharm中,我们就可以使用这个包。
我们在项目名称上点击鼠标右键,选择新建(New)Python文件(Python File)。
注意:包的创建也可以在PyCharm中完成(见上图)。
为这个新建的文件取一个名称,例如:case。点击确定(OK)完成创建。
然后,在这个新建的case模块中,我们就可以导入包和包的模块了。
用法有下面这几种:
from package import sayhello # 从包中导入模块 sayhello.hello() # 通过模块调用方法 from package.sayhello import hello # 从包的模块中导入方法 hello() # 直接调用方法 import package # 导入包 package.sayhello.hello() # 通过包调用模块再调用方法 import package.sayhello as say # 导入包的模块对象到变量 say.hello() # 通过模块对象调用方法
以上就是包的创建和使用。
当一个项目有大量的模块,这个时候往往需要通过包将关联性比较高或者同类的模块归纳到一起,方便模块的查找调用。
二、模块
1、模块的运行
在前面我们已经了解,模块通过import语句或者from/import语句进行导入。
那么,导入模块会发生什么?
示例代码:
from package import sayhello # 显示输出结果为:你好!帅帅的小楼!
大家能够发现,sayhello模块中的hello()语句被执行了。
所以,模块就是程序,它会在导入时被运行(定义模块的命名空间)。
不过,模块只是在第一次导入时会被执行,这避免了模块互相调用时无限运行的问题。
from package import sayhello # 显示输出结果为:你好!帅帅的小楼! from package import sayhello # 没有显示输出任何内容
2、有条件运行模块
继续上面的例子,我们能够看到hello()语句被执行,但是这个语句是我们用来测试模块中编写的函数的,在其它模块调用sayhello模块的时候,我们并不想让这个测试语句被执行。
怎么避免这些测试代码也被运行呢?
首先,我们先来看看一个模块的名称是什么?
通过下面的语句,我们就能看到模块的名称。
sayhello模块中运行的语句:
print(__name__) # 显示输出结果为:__main__
case模块中运行的语句:
print(sayhello.__name__) # 显示输出结果为:package.sayhello
很显然,同样是获取sayhello模块的名称,在调用sayhello模块的模块中显示的是“package.sayhello”(包和模块的名称),而在sayhello模块中显示的是“__main__”。
知道了这个特点,我们就可以对测试代码添加运行的限制。
在sayhello模块中,写入以下代码:
def hello(): print('你好!帅帅的小楼!') if __name__ == '__main__': # 判断测试语句是否在模块自身运行 hello() # 测试语句,显示输出结果为:你好!帅帅的小楼!
通过条件判断,我们就完成了对测试语句运行的限制。
from package import sayhello # 没有显示输出任何内容
3、模块的优点
模块的优点在于,它可以是抽象的,能够被复用的。
这就像一个高富帅(功能代码),如果结婚了(和其他代码写在一起),他的功能(钱、车、小丁丁…)都只能被老婆使用(写在一起的代码);但是如果他是单身(独立为模块),那么它的功能(钱、车、小丁丁…)可以被任何一个想和他啪啪啪(导入模块)的妹子们(所有使用模块的代码)使用。
所以,我们应该把编写的程序中可以抽象的部分独立为模块,这样会很大程度上提升工作效率,也能够让程序变得更加清晰、简洁。
4、模块的位置
当我们在PyCharm中创建了模块,这些模块会保存到项目的文件夹中,我们可以直接通过import进行导入使用。
那么,如果是一些外来的模块,怎么进行使用呢?
有三种使用办法:
1、把模块添加到当前项目的文件夹中(使用PyCharm这样的开发环境可以这么做)。
例如,我们把一个模块放在我们前面创建的MyProject文件夹中(D:\MyProject),就能够在case模块中导入。
2、把模块添加到Python解释器查找可用模块时,默认被查询的文件夹中。
Python查找可用模块时,会查找哪些文件夹呢?
我们可以查询一下这些文件夹的路径。
示例代码:
import sys, pprint # 导入内置的sys和pprint模块 pprint.pprint(sys.path) # 显示输出系统路径
注意:上方代码中pprint()函数,可以让路径列表中的内容自动换行显示输出。如果使用print()函数都会在一行显示。
代码运行结果如下:
上方运行结果中的文件夹路径,都是Python解释器会查询的文件夹路径,外来的模块放在这些路径中就能够直接导入使用,但是大家能够看到有一个路径结尾的文件夹名称是“site-packages”,建议把外来模块放入到这个文件夹中。
3、在程序中指定需要使用模块的路径。
我们可以在代码中,手动添加外来模块的文件夹路径,到Python解释器默认查询的文件夹路径列表中,从而保证能够正常导入模块。
假设:我们在“D:\Other”的文件夹中有一个“mod.py”模块。里面加入一条语句:print(r’我是“D:\Other”中的模块!’)
示例代码:(Windows系统)
import sys sys.path.append('D:\\Other') # 将外来模块所在文件夹路径添加到默认查询的文件夹路径列表 import mod # 导入模块,显示输出结果为:我是“D:\Other”中的模块!
注意:UNIX/Mac OS X系统中要写入文件的完整路径。
以上就是使用外来模块的方法。
另外,当运行了上方 代码之后,大家打开外来模块所在的文件夹,会看到一个名为“__pycache__”的文件夹,这是一个缓存文件夹,里面有后缀为“.pyc”的文件,从文件名我们可以看出这个文件和“mod.py”文件有关联。
没错!这个文件是“mod.py”编译后的文件。
当我们重复导入(第一次之后)模块“mod.py”的时候,实际上导入的是这个“.pyc”的文件。
这个文件可以删除,对程序没有任何影响,当导入模块时,还会自动生成。
并且,当我们修改模块,这个文件也会即时刷新。
本节知识点:
1、包的创建与使用
2、模块的特点
3、使用外来模块的方法
本节英文单词与中文释义:
1、file:文件
2、project:项目
3、package:包
4、module:模块
5、cache:缓存
6、pyc(python compile):python编译文件后缀
7、main:主要
8、other:其他
9、pprint(pretty print):漂亮的打印
转载请注明:魔力Python » Python3萌新入门笔记(35)