python|10、python——模块与包

1、模块的导入 1.1、什么是模块 模块就是 Python文件 ,里面定义了很多的函数、类、变量 。一个完整大型的python程序是由 模块和包 的形式组织起来的,可见模块在python中的重要性。 1.2、模块有什么作用 在python交互式解释器中操作输入的代码,在退出python时是不会被保存的; 而模块文件中的代码是 永久存在 的。减少重复代码, 减少工作量(写的量、改的量)、代码更优雅、拿来主义 1.3、模块的分类 (1)、标准模块,无需安装和编写,自动导入就有的模块,比如说random,math
(2)、第三方模块,别人写到的发布到平台上的模块,需要安装的模块,比如,requests,需要pip安装的
(3)、自定义模块,自己写的模块
1.4、什么是包 Python包实际上是一个目录,包含python的目录
1.4.1、py3和py2在包结构里的区别(__init__.py)
包结构的目录里有一个_int_.py的模块。这是一个初始化文件,一般导入当前包里的内容,都会执行__init__.py文件,用于初始化数据库连接
py2,_int_.py是必须的;py3,_int_.py是可选的,例如:
python|10、python——模块与包
文章图片

这里,py2只会识别pack02是一个包,而py3会识别pack01和pack02为包
1.4.2、模块和包名要尽量和内置的模块名不相同, 不然会覆盖内置的模块
若是有一样的模块名了,且不能够修改,我们可以使用别名来区分并且调用这些模块
1.5、import与from import 导入 导入标准库和导入自定义库是有一些区别的
1.5.1、直接导入模块

import stringprint(string.ascii_uppercase)# 执行结果:ABCDEFGHIJKLMNOPQRSTUVWXYZ

1.5.2、从包或者模块里导入函数
# 从string里单独导入具体的遍变量或者函数,导入之后可以不用"string."调用这个函数或者类 from string import ascii_uppercaseprint(ascii_uppercase)# 执行结果:ABCDEFGHIJKLMNOPQRSTUVWXYZ

导入所有函数(模糊导入)
from string import *print(ascii_lowercase)# 执行结果:abcdefghijklmnopqrstuvwxyz

1.5.3、导入自定义模块,并且访问
目录结构展示:
【python|10、python——模块与包】python|10、python——模块与包
文章图片

包展示:
# pack01/one.py print("this is pack01 one")def packtest(): print("pack01 test func")# pack02/one.py print("this is pack02 one")def packtest(): print("pack02 test func")

# two.py print("i am subpk01 two model")

# three.py print("i am subpk02 three model")

分割线
# 这个代码是在mod.py这个主程序或者说程序入口执行的(top_level) import pack01# ×这个只是导入了包 pack01.one.packtest()# 执行之后会报错

[错误做法]
python|10、python——模块与包
文章图片

导入自定义模块时,光导入包是无法识别的,必须要导入到模块这层才能够被识别。
[正确做法]
# 当这样导入的时候,这种导入叫做直接导入 # 就是直接运行了E:\python\Python\python.exe F:/Desktop/Pycharm练习/模块与包/模块导入/mod.py from pack01 import one# 执行结果:this is pack01 one # 另外,这是虽然只导入了one,但是其实整个pack01都运行了

1.6、模块运行方式 模块运行方式有两种方式:直接解释器运行(直接运行的为主程序/程序入口)和导入运行(只要导入了模块(无论整体或者部分),那么这个整个模块都会运行)
1.6.1、可以重复导入,但只会执行一次
第一次导入的时候,就会将这个模块加载到内存空间,下次导入的时候,会先查看内存空间有没有
# 从pack01包中导入了one这个模块 from pack01 import one from pack01 import one# 执行结果 this is pack01 one

1.6.2、如果导入的模块名相同会发生什么
# 如果导入的模块明相同,就使用后导入的模块 from pack01.one import packtest from pack02.one import packtest packtest() # 执行结果: this is pack01 one this is pack02 one pack02 test func

解决办法:给模块取别名---as
1.6.3、给模块取别名
# 从pack02.one模块中导入packtest函数,取别名叫做pk02 from pack02.one import packtest as pk02 pk02() # 执行结果 pack02 test func

1.6.4、动态导入
接受字符串,动态导入。需要使用"importlib"模块
import importlib st = importlib.import_module('string') print(st.digits) # 执行结果: 0123456789

[动态导入脚本]
# 要求:接受用户从键盘的输入,按q退出,用户输入什么模块就导入什么模块,并提示导入成功 import importlibwhile True: try:# 执行要尝试(try)的代码 module_name = input("请输入你要导入的模块:") if module_name.lower() == "q": print("模块导入结束") break st = importlib.import_module(module_name) print("导入成功!") except:# 执行应对异常发生时的代码 print("\033[31m没有这个模块!\033[0m")

[执行结果查看]
python|10、python——模块与包
文章图片

1.6.5、相对导入和绝对导入
以". "开头的导入路径称为相对导入
. 表示当前
.. 表示上一级
... 表示上上级
相对导入不能访问到top-level那一层,只能访问到top-level以下层
在top-level以下层推荐使用相对导入,否则程序入口改变绝对路径就会改变
绝对导入路径 就是从top-level那一层开始,一层一层往下数
python|10、python——模块与包
文章图片

简单来说,若是以mod.py作为程序入口,那么它和它平级的pack01和pack02都是top-level

    推荐阅读