Day 23
今日内容概要
- 绝对导入与相对导入
- 包的概念
- 编程思想的转变
- 软件开发目录规范
- 常见内置模块
今日内容详细
1.绝对导入与相对导入
#只要涉及到模块的导入 那么sys.path永远以执行文件所在的路径为准
以上解决办法有两种
1)把cc文件夹路径添加到sys.path路径中(通用方法 什么时候都可以用)
2)在bb模块中把import bb改为from cc import bb(该方法就是绝对导入)
1.绝对导入:
就是以执行文件所在的sys.path为起始路径 往下一层层查找
如果是文件名嵌套文件名,则需要在文件名后加点和内层文件名
from cc.dd.ee import bb
ps: 由于pycharm会自动将项目根目录添加到sys.path中,所以查找模块肯定不报错的方法就是永远从根路径往下层层查找
如果不是用pycharm运行(cmd) 则需要将项目根目录添加到sys.path路径中(有模块可以帮助我们获取根目录的绝对路径'os模块')
2.相对导入:
储备知识:
.在路径中是当前路径
..在路径中是上一层路径
../..在路径中是上上一层路径
相对导入可以不参考执行文件所在的路径 直接以当前模块文件路径为准
eg:
from . import b #在执行文件中输入该代码则是在当前路径查找b
相对导入的缺陷:
1)只能在模块文件中使用 不能再执行文件中使用
2)相对导入在项目较复杂的情况下可能会出错
#能少用相对导入就少用 建议使用绝对导入
2.包的概念
Package:包
1.包是什么?
专业角度:内部含有__init__.py文件的文件夹就叫包
直观角度:就是一个文件夹
2.包的作用是什么?
内部存放多个py模块文件,仅仅是为了更方便管理模块文件
3.具体使用
import 包名
导入包名起始导入的是里面的__init__.py文件,该文件里有什么才能用什么,如果里面什么都没有那也是白导
也可以跨过__init__.py 直接用from 包名 import 模块,模块
'''
针对python3解释器 文件夹里有没有__init__.py无所谓,都是包
针对python2解释器 文件夹里必须有__init__.py才能叫做包
最好加上,为了适应多个版本解释器
'''
3.编程思想的转变
1.小白阶段
按照需求从上往下堆叠代码 单文件
2.函数阶段
将代码按照功能的不同封装成不同的函数 单文件
3.模块阶段
根据功能的不同拆分不同的模块文件 多文件
'''
小白阶段相当于将所有的文件全部存储在c盘且不分类
函数阶段相当于将所有的文件在c盘下分类
模块阶段相当于将所有文件按照功能的不同分类到不同盘中
目的是为了更加方便快捷高效的管理资源
'''
4.软件开发目录规范
针对上述第三个阶段 模块文件多了之后还需要有文件夹
所有程序目录都有一些规范(有多个文件夹)
1.bin文件夹
用于存储程序的启动文件 start.py
2.conf文件夹
用于存储程序的配置文件 settings.py
3.core文件夹
用于存储程序的核心逻辑 src.py
4.lib文件夹
用于存储程序的公共功能(很多文件都要用的) common.py
5.db文件夹(可被数据库替代)
用于存储程序的数据(用户核心数据) userinfo.txt
6.log文件夹(可被日志服务替代)
用于存储程序的日志文件(类似监控) log.log
7.interface文件夹
用于存储程序的接口文件(核心逻辑太多需分层) user.py order.py goods.py
8.readme文件(文本文件)
用于编写程序的说明、介绍、广告 类似说明书
9.requirements.txt文件
用于存储程序所需的第三方模块名称和版本
'''
编写程序时可以不完全遵循以上文件名
start.py可以放在bin文件夹下也可以放在项目根目录中
db文件夹以后会被数据库软件替代
log文件夹会被专门的日志服务替代
'''
5.常见内置模块
1.collections模块
给我们提供了更多数据类型
1.1.具名元组(含有名字的元组) namedtuple
from collections import namedtuple
point=namedtuple('二维坐标系',['x','y'])
res1=point(1,2)
res2=point(10,12)
print(res1,res2)#二维坐标系(x=1, y=2) 二维坐标系(x=10, y=12)
print(res1.x)#1
print(res2.y)#12
——————————————————————————————————————————————
from collections import namedtuple
point=namedtuple('三维坐标系',['x y z'])
res1=point(1,2,4)
res2=point(10,12,25)
print(res1,res2)#三维坐标系(x=1,y=2,z=4) 三维坐标系(x=10,y=12,z=25)
eg: 简单扑克牌
from collections import namedtuple
p=namedtuple('扑克牌',['花色','点数'])
res1=p('♥','A')
res2=p('♠','A')
print(res1)#扑克牌(花色='♥', 点数='A')
print(res2)#扑克牌(花色='♠', 点数='A')
1.2.双端队列 deque
from collections import deque
q = deque()
q.append(111)
q.append(222)
q.appendleft(555)#头部追加
print(q)#deque([555, 111, 222])
1.3.有序字典 OrderedDict
from collections import OrderedDict
od = OrderedDict([('a', 1), ('b', 2), ('c', 3)])
print(od)#OrderedDict([('a', 1), ('b', 2), ('c', 3)])
1.4.默认字典 defaultdict
#有如下值集合 [11,22,33,44,55,66,77,88,99,90],
# 将所有大于 66 的值保存至字典的第一个key中,将小于 66 的值保存至第二个key的值中
# {'k1':[], 'k2':[]}
from collections import defaultdict
res = defaultdict(k1=[],k2=[])
print(res)#defaultdict(None, {'k1': [], 'k2': []})
1.5.计数器 Counter
eg:循环统计个字母出现的次数
res = 'abcdeabcdabcaba'
方式1:
new_dict = {}
for i in res:
if i not in new_dict:
new_dict[i] = 1
else:
new_dict[i] += 1
print(new_dict)
方式2:
from collections import Counter
res1 = Counter(res)
print(res1)
2.时间模块之time模块
时间的三种格式
1.时间戳 time.time()
2.结构话时间 time.gmtime()
3.格式化时间 time.strftime('%Y-%m-%d %H:%M:%S')
%Y 年 %m 月 %d日
%H 时 %M 分 %S秒 或 %X(%X就是时分秒)
作业:
1.整理今日内容及笔记
2.熟悉软件开发目录规范
尝试将之前的编程大题用软件开发目录规范去套
3.预习明日内容
原创文章,作者:sunnyman218,如若转载,请注明出处:https://blog.ytso.com/tech/python/274426.html