Python 全栈开发:python模块与包
一、模块介绍
1.什么是模块
模块是一个包含所有你定义函数和变量的文件,即:一个python文件就可以称之为一个模块。
在python中,模块的使用方式都是一样的,细分可以分为四个通用类别:
- 使用python编写的.py文件
- 已被编译为共享库或DLL的c或c++扩展
- 把一系列模块组织到一个的文件夹(注:文件夹下有一个__init__.py的文件,该文件夹叫做 包)
- 使用C编写病链接到python解释器的内置模块
2.为何要使用模块
#1、从文件级别组织程序,更方便管理 随着程序的发展,功能越来越多,为了方便管理,我们通常将程序分成一个个的文件,这样做程序的结构更清晰,方便管理。
这时我们不仅仅可以把这些文件当做脚本去执行,还可以把他们当做模块来导入到其他的模块中,实现了功能的重复利用 #2、拿来主义,提升开发效率 同样的原理,我们也可以下载别人写好的模块然后导入到自己的项目中使用,这种拿来主义,可以极大地提升我们的开发效率 #ps: 如果你退出python解释器然后重新进入,那么你之前定义的函数或者变量都将丢失,
因此我们通常将程序写到文件中以便永久保存下来,
需要时就通过python test.py方式去执行,此时test.py被称为脚本script。
二、import语句
import python内建函数 time 模拟跑了一分钟(test.py)
#!/usr/bin/env python3 # encoding: utf-8 # by fixdq import time def running(): time.sleep(60) # 秒 print('刚刚跑了钟')
running()
1. import 语句可以在程序中的任何位置使用(一般都放在文件的头部),多次导入同一个模块,只会执行一次
2.在第一次导入模块会做三件事
- 为源文件(模块)创建新的名称空间
- 在新创建的名空间中执行模块中包含的代码
- 创建名字来使用该命名空间
3.被导入模块有独立的名称空间
每个模块都是一个独立的名称空间,定义在这个模块中的函数,把这个模块的名称空间当做全局名称空间,这样我们在编写自己的模块时,就不用担心我们定义在自己模块中全局变量会在被导入时,与使用者的全局变量冲突
4.为模块起别名
起别名的方式对编写可扩展的代码很有用
import time as t def running(): t.sleep(5)
5.在一行导入多个模块
import sys,os,re
三、from...import语句
Python的from语句让你从模块中导入一个指定的部分到当前命名空间中
1.使用方式
from modname import name1[, name2[, ... nameN]]
2.同样支持 as 别名
from spam import read as re
3.一行导入多个名字
from spam import read,read1,money
4.from…import* 语句
把一个模块的所有内容全都导入到当前的命名空间
from modname import *
#大部分情况下我们的python程序不应该使用这种导入方式,
#因为*你不知道你导入什么名字,很有可能会覆盖掉你之前已经定义的名字。
#而且可读性极其的差,在交互式环境中导入时没有问题。
5.from...import 与import的对比
#唯一的区别就是:使用from...import...则是将模块中的名字直接导入到当前的名称空间中,
所以在当前名称空间中,直接使用名字就可以了、无需加前缀:模块名 #from...import...的方式有好处也有坏处 好处:使用起来方便了 坏处:容易与当前执行文件中的名字冲突
四、py文件区分两种用途:模块、脚本
#编写好的一个python文件可以有两种用途: 一:脚本,一个文件就是整个程序,用来被执行 二:模块,文件中存放着一堆功能,用来被导入使用 #python为我们内置了全局变量__name__, 当文件被当做脚本执行时:__name__ 等于'__main__' 当文件被当做模块导入时:__name__等于模块名 #作用:用来控制.py文件在不同的应用场景下执行不同的逻辑 if __name__ == '__main__':
五、模块搜索路径
模块的查找顺序是:
内存中已经加载的模块-->内置模块-->sys.path路径中包含的模块
python文件中
lib里面放的是内置模块
扩展模块一般在site-packages中
sys.path:注意:搜索时按照sys.path中从左到右的顺序查找,位于前的优先被查找,sys.path中还可能包含.zip归档文件和.egg文件,python会把.zip归档文件当成一个目录去处理。
千万不要自己定义这些你熟悉的模块或关键字啊啥的作为自己的模块名
六、包
1.什么是包
#官网解释 包是一种通过使用‘.模块名’来组织python模块名称空间的方式。 #具体的:包就是一个包含有__init__.py文件的文件夹,所以其实我们创建包的目的就是为了用文件夹将文件/模块组织起来 #需要强调的是: 1. 在python3中,即使包下没有__init__.py文件,import 包仍然不会报错,
而在python2中,包下一定要有该文件,否则import 包报错
2. 创建包的目的不是为了运行,而是被导入使用
记住,包只是模块的一种形式而已,包的本质就是一种模块
2.为什么使用包
包的本质就是一个文件夹,那么文件夹唯一的功能就是将文件组织起来
随着功能越写越多,我们无法将所以功能都放到一个文件中,于是我们使用模块去组织功能,
而随着模块越来越多,我们就需要用文件夹将模块文件组织起来,以此来提高程序的结构性和可维护性
3.包的使用 import 、form...import..
包的本质就是一种模块,使用方法都是一样的
import
单独导入包名称时不会导入包中所有包含的所有子模块
from...import...
需要注意的是from后import导入的模块,必须是明确的一个不能带点,否则会有语法错误,
如:from a import b.c是错误语法
from...import*
此处是想从包api中导入所有,实际上该语句只会导入包api下__init__.py文件中定义的名字,
我们可以在这个文件中定义__all___:
#在__init__.py中定义 x=10 def func(): print('from api.__init.py') __all__=['x','func','policy']
4.绝对导入和相对导入
包以及包所包含的模块是用来被导入的,而不是用来执行的。环境变量都是以执行文件为准的。
绝对导入:以包的顶级目录作为起始点,导入包
相对导入:以.或..的方式为起点,(只能在一个包中使用,不能用于不同的目录)
5.包的分发(大神常用)
https://packaging.python.org/distributing/
_*_ coding:utf-8 _*_