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是可选的,例如:
文章图片
这里,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——模块与包】
文章图片
包展示:
# 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()# 执行之后会报错
[错误做法]
文章图片
导入自定义模块时,光导入包是无法识别的,必须要导入到模块这层才能够被识别。
[正确做法]
# 当这样导入的时候,这种导入叫做直接导入
# 就是直接运行了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")
[执行结果查看]
文章图片
1.6.5、相对导入和绝对导入
以". "开头的导入路径称为相对导入
. 表示当前
.. 表示上一级
... 表示上上级
相对导入不能访问到top-level那一层,只能访问到top-level以下层
在top-level以下层推荐使用相对导入,否则程序入口改变绝对路径就会改变
绝对导入路径 就是从top-level那一层开始,一层一层往下数
文章图片
简单来说,若是以mod.py作为程序入口,那么它和它平级的pack01和pack02都是top-level
推荐阅读
- python|python2和python3版本的区别
- 强化学习|强化学习笔记(五)Pytorch实现简单DQN
- 定位|利用稀疏的语义视觉特征进行道路建图和定位(ICRA2021)
- 可视化|opencv基础入门——环境搭建与基础操作
- Python学习笔记|Newton法求解非线性方程(Python实现)
- Python学习笔记|利用pyecharts绘制省市地图
- Python学习笔记|Python连接MySQL数据库并读取显示数据
- #|一个辅助 VSCode 下开发 STM32 的脚本
- 解锁一个新技能,如何在Python代码中使用表情包...