【2022.7.14】python基础之【模块导入路径.包.软件目录.内置模块】介绍
学习内容概要
- 绝对导入与相对导入
- 包的概念
- 编程思想的转变
- 软件开发目录规范
- 常见内置模块 (时间模块,正则模块)
内容详细
绝对导入与相对导入
- 1.绝对导入
和之前学过的绝对路径相同 所给的信息都是准确的 精确的 绝对导入也是一样 就是以执行文件所在的位置 sys.path 为起始路径 按照顺序一层层往下找
!!!!!!!!!!!!!!!!!!!!!!!!!!!
只要涉及到模块的导入 那么sys.path永远以执行文件为准
!!!!!!!!!!!!!!!!!!!!!!!!!!!
提醒:由于pycharm会自动将项目根目录添加到sys.path中所以查找模块肯定不报错的方法就是永远从根路径往下一层层找
注意:如果不是用pycharm运行 则需要将项目跟目录添加到sys.path
如果发送给他人 py文件 转移到其他电脑上 该如何获取:(针对项目根目录的绝对路径有模块可以帮助我们获取>>>:os模块)
-
2.相对导入
&& 相对导入的方法 我们首先来了解一下
. 在路径中意思是当前路径
.. 在路径中意思是上一层路径
../.. 在路径中意思是上上一层路径
注意:相对导入与绝对导入不同 相对导入 可以不参照执行文件的路径 直接以当前模块的路径为准
提醒:相对导入在项目比较复杂 文件夹很多的情况下 可能会弄混 容易出错 不建议使用
强烈建议:无脑使用绝对导入 肯定不会出错
包的概念
-
1.如何理解包
专业的角度:创建一个包 内部含有一个__init__.py 的文件夹
直观的角度:就像文件夹一样 没有太大区别
-
2.包的作用
就像文件夹一样 内部可以存放文件 包的内部存放的是多个py文件 (模块文件) 是为了 更加方便的管理模块文件
-
3.具体使用方式
import + 包的名字
# 导入包名实际是导入包内部的 __init__.py 文件 __init__.py 文件内有什么 才能用什么 (一般情况 都是提前把包内部的模块文件功能 都以存入__itin__中 为了方便导入)
# 也可以不通过__init__.py 文件 直接导入包里的模块文件 这样也可以
# 包在python2解释器和python3解释器中的区别解释
"""
针对python3解释器 其实文件夹里面有没有__init__.py已经无所谓了 都是包
但是针对Python2解释器 文件夹下面必须要有__init__.py才能被当做包
"""
编程思想的转变
-
1.初始阶段
[在一个py文件中] 按需编写代码 (堆叠方式)
-
2.函数阶段
[在一个py文件中] 可以将代码按照不同的功能 封装成不同的函数 然后整合调用
-
3.模块阶段
[在多个py文件中] 把不同功能的模块 区分放在不同的py文件中 方便编写导入
-
大致过程:
初始阶段(文件全存在C盘)>>> 函数阶段(把C盘的文件分类存储)>>> 模块阶段(按照不同类型的功能 存入到不同的盘中)
【其目是为了更加方便快捷高效的管理资源】
软件开发目录规范
文件夹名字 | 格式 | 作用 |
---|---|---|
bin文件夹 | start.py | 用于存储程序的启动文件 |
conf文件夹 | settings.py | 用于存储程序的配置文件 |
core文件夹 | src.py | 用于存储程序的核心逻辑 |
lib文件夹 | common.py | 用于存储程序的公共功能 |
db文件夹 | userinfo.txt | 用于存储程序的数据文件 |
log文件夹 | log.log | 用于存储程序的日志文件 |
interface文件夹 | ser.py order.py goods.py | 用于存储程序的接口文件 |
readme文件(文本文件) | specification.txt | 用于编写程序的说明、介绍、广告 类似于产品说明书 |
requirements.txt文件 | copy.txt | 用于存储程序所需的第三方模块名称和版本 |
. 仅供参考 文件名可以根据实际情况而取名 start.py可以放在bin文件夹下也可以直接放在项目根目录
常见内置模块
1.collections 模块(给使用者提供了更多的数据类型)
# 上述的 collections 相当于一个包 里面有 __init__文件 我们就是导入__init__使用里面的名字的
from collections import namedtuple
①
point = namedtuple('二维坐标系',['x','y'])
res = point(1,3) # 二维坐标系(x=1, y=3) 给上述式子传值
res1 = point(2,4) # 二维坐标系(x=2, y=4
print(res,res1) # 二维坐标系(x=1, y=3) 二维坐标系(x=2, y=4)
print(res.x) # 通过点的方式看坐标轴 x y 的值
print(res1.y) # 通过点的方式看坐标轴 x y 的值
from collections import namedtuple
②
Point = namedtuple('三维坐标系', 'x y z')
res1 = Point(23,45,6)
print(res1) # 三维坐标系(x=23, y=45, z=6) 也可以传输 x y z 三个值
res2 = Point(23,34,65)
print(res2) # 三维坐标系(x=23, y=34, z=65)
print(res1.z) # 6
print(res1,res2) # 三维坐标系(x=23, y=45, z=6) 三维坐标系(x=23, y=34, z=65)
from collections import namedtuple
③
n = namedtuple('扑克牌', ['花色', '点数'])
res1 = n('♥', 'A')
res2 = n('♠', 'A')
res3 = n('♦','A')
print(res1,res2,res3) # 扑克牌(花色='♥', 点数='A') 扑克牌(花色='♠', 点数='A') 扑克牌(花色='♦', 点数='A')
- 双端队列
from collections import deque
res = deque()
res.append(555) # deque([555])
res.append(222) # deque([555, 222])
res.appendleft(333) # deque([333, 555, 222])
print(res)
"""
通过调用模块 collections 用.append和.appendleft的方式 便捷的把数据值添加到容器里(双端队列)
"""
- 有序字典
from collections import OrderedDict
d = dict([('a',1),('b',2),('c',3)])
print(d) # {'a': 1, 'b': 2, 'c': 3}
od = OrderedDict([('a', 1), ('b', 2), ('c', 3)])
print(od) # OrderedDict([('a', 1), ('b', 2), ('c', 3)])
"""
OrderedDict 有序字典的意思 字典都是无序的 导入它就可以把你的地点变成有序字典
"""
- 默认值字典
#有如下值集合 [11,22,33,44,55,66,77,88,99,90],
# 将所有大于 66 的值保存至字典的第一个key中,将小于 66 的值保存至第二个key的值中
情况一:
l1 = [11,22,33,44,55,66,77,88,99,90]
a = []
b = []
d = {}
for i in l1:
if i < 66:
a.append(i)
else:
b.append(i)
d['k1'] = a
d['k2'] = b
print(d) # {'k1': [11, 22, 33, 44, 55], 'k2': [66, 77, 88, 99, 90]}
情况二:默认值defaultdict
from collections import defaultdict
res = defaultdict(k1=[],k2=[])
for i in l1:
if i < 66:
res['k1'].append(i)
else:
res['k2'].append(i)
print(res) # defaultdict(None, {'k1': [11, 22, 33, 44, 55], 'k2': [66, 77, 88, 99, 90]})
- 统计次数
res = 'abcdeabcdabcaba'
情况一:
new_dict = {}
for i in res:
if i not in new_dict:
new_dict[i] = 1
else:
new_dict[i] += 1
print(new_dict) # {'a': 5, 'b': 4, 'c': 3, 'd': 2, 'e': 1}
情况二:
from collections import Counter
res1 = Counter(res)
print(res1) # Counter({'a': 5, 'b': 4, 'c': 3, 'd': 2, 'e': 1})
- 时间模块
时间模块 | 导入方式 |
---|---|
时间戳 | time.time |
结构化时间 | time.gmtime() |
格式化时间 | time.strftime() |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了