day15自定义模块的导入
自定义模块
- 什么是模块:本质就.py文件,封装语句的最小单位。
- 自定义模块:
- 编写自定义模块开头最好用多行注释说明模块内容。
- 模块中出现的变量(for循环、if结构、函数定义等)称为模块的成员。
- 模块的运行方式:
1)脚本方式:直接用解释器执行,或者在pycharm中右键运行。
2)模块方式(导入方式):被其他的模块导入,为导入它的模块提供资源(变量、函数定义、类定义等)。
导入自定义模块:
1)模块被其他模块导入时,其中的可执行语句会立即执行。因此python中提供了一种可以判断自定义模块是属于开发阶段还是使用阶段的属性,即__name__
:print(__name__)#编写在自定义模块中
以脚本方式运行时是固定的字符串__main__
,在以模块被导入的方式运行时,会打印出自定义模块名。因此可以在自定义模块代码中编写if __name__ =='__main__:'
以用来判断是否需要直接运行模块中的语句(即判断是处于开发阶段还是使用阶段)。
2)通常定义函数(包含测试函数),再将函数的调用放在if __name__=='__main__':
(快捷键:main+回车)代码块下。这样当自定义模块被导入时可执行语句不会直接运行。
3)自定义模块的使用:模块名.成员名(以import xxx
方式导入)
4)在同级目录下导入模块:直接导入。
5)在不同的目录下导入模块(若相对导入可以解决就用相对导入,相对导入下文有介绍):
系统导入模块的路径:
1)内存中:如果之前成功导入过某个模块,会直接使用已经存在的模块。
2)内置路径中:在python安装路径中lib和site-packages文件夹下。
3)sys.path(没有提供源码,用c语言编写直接集成在解释器上):是一个路径的列表(动态可修改)。
4)查看sys.path内容:import sys print(sys.path)
打印出的列表第一个元素是当前脚本路径,第二个元素是当前项目的路径。
5)__file__
可获取当前文件的绝对路径。可使用os模块获取一个文件路径的父路径:import os os.path.dirname(__file__)
6)将自定义模块文件夹所在的路径添加到sys.path中:python import os import sys sys.path.append('模块文件夹路径')
6)自定义模块书写标准:通常一个脚本中都会包含if __name__=='__main__':
def func(): ...... def main(): #测试函数 pass if __name__=='__main__': main()
导入模块的方式:
-
import xxx
:导入一个模块的所有成员。必须使用模块名作为前缀。
2)import xxx,yyy,....
:一个性导入多个模块的成员,不推荐这种写法,建议分开写。但经常将这两个模块放在一块写:import os,sys
3)from xxx import y
:从某个模块中导入指定的成员。
4)from xxx import a,b,c,......
:从某个模块中导入多个成员。
5)from xxx import *
:默认从某个模块中导入全部成员,不用使用模块名作为前缀,直接使用成员名即可。为了避免导入多余的成员python默认使用了一个指令__all__
,它是一个列表,用于表示本模块可以被外界使用的成员,元素是成员名组成的字符串。即在自定义模块中编写__all__=['','',...]
列表中应是可被导入用的成员。但__all__
只对此种导入方法起作用。
6)用3,4,5方法容易导致命名冲突。在后面定义的成员生效,会吧前面重名的成员覆盖。
7)为了避免6所叙述的问题,可以使用别名(alias,缩写为as)导入:import xxx as z
导入xxx模块重命名为z。
8):from xxx import yyy as z
导入xxx模块将成员名重命名为z。
相对导入:
1)针对某个项目中的不同模块之间进行导入,称为相对导入(模块间必须有同一个文件夹路径)。
2)相对导入只有一个语法:from 相对路径 import xxx
相对路径:包含了点号的一个相对路径。
.:表示当前的路径。
..:表示的是父路径
...:表示的是父路径的父路径
..x.y:表示的是父路径下x文件夹下的y文件(夹)
举例:在python文件夹下有t1和t2两个文件夹,t1和t2文件夹下分别有pt1.py和pt2.py两个模块。python文件夹在workspace文件夹下,workspace下有一个main.py文件。
#相对导入(在pt1.py文件中编写): #1.将pt1作为对外界的接入口: from ..t2 import pt2 #..:从当前的路径(不包含当前文件,即/workspace/python/t1)的父目录(/workspace/python/)下找t2,在从t2中找pt2。 #测试相对导入(在main.py文件中编写): import os,sys sys.path.append(os.path.dirname(__file__)) #把项目所在的父路径加到sys.path中。 from python.t1 import pt1 #使用pt1.py模块文件导入的pt2.py模块中的成员: pt1.pt2.成员名 #但不推荐这样写。容易向外界暴露pt2模块。 #更改方法(真正的相对导入): #相对导入(在pt1.py文件中编写): #1.将pt1作为对外界的接入口: from ..t2.pt2 import * #直接导入pt2模块 #测试相对导入(在main.py文件中编写): import os,sys sys.path.append(os.path.dirname(__file__)) #把项目所在的父路径加到sys.path中。 from python.t1 import pt1 #使用pt1.py模块文件导入的pt2.py模块中的成员: pt1.成员名 #成员名:可以是pt1和pt2模块的成员。 #不用相对导入(不推荐): #1.在pt1模块下编写: import os,sys sys.path.append(as.path.dirname(os.path.dirname(__file__))+'/t2') from pt2 import *
常用模块:random(后续更新)
1)random模块(pseudo-random,伪随机数):提供了随机数获取的方法
1)random.random():获取[0.0,1.0)范围内的浮点数。
2)random.randint(a,b):获取[a,b]范围内的一个整数。
3)random.uniform(a,b):获取[a,b]范围内的一个浮点数数。
4)random.shuffle(x):把参数指定的数据中的元素打乱,参数必须是一个可变的数据类型。没有返回值(因为是直接将x打乱,调用改函数后x会被改变,与append无返回值原因相同。)(不支持元祖,可用sample打乱)
5)random.sample(x,k):从x中随机抽取k个数据,组成一个列表返回。
6)random.randrange(start,stop,step):生成一个[start,stop)之间以step为步长的随机整数。默认步长为1。
7)random.seek(a):设置初始化随机数种子。a,随机数种子,可以是整数或浮点数。使用random库产生随机数不一定要设置随机数种子,如果不设置,random库默认以系统时间产生当做随机数种子。设置随机数种子的好处是可以重复在现相同的随机数序列。