Day24 软件目录规范以及 常见模块
1、绝对导入与相对导入
只要涉及到模块导入,那么sys.path永远以执行文件为准
1.1、绝对导入
由于pycharm会自动将项目根目录添加到sys.path中,所以查找模块不报错的方式就是从根路径一层一层往下找(通过句点符连接下一层目录名)
如果不是用pycharm运行,则需要先将项目根目录添加到sys.path(针对项目根目录的绝对路径有模块可以帮助我们获取>>>:os模块)
from Day23.bin import start
1.2、相对导入
储备知识
符号 | 含义 |
---|
. | 表示当前路径下 | … | 表示上一层路径 | …/… | 表示上上一层路径 |
from..conf import settings
相对路径只能在模块中使用,不能在执行文件中使用
相对路径不用参考执行文件所在路径,直接以当前模块文件路径为准
相对路径在项目比较复杂的情况下可能会出错
2、包的概念
-
如何理解包: ? 专业的角度:内部含有__inter _ _.py的文件价 ? 直观角度:就是一个文件夹 -
包的作用: ? 内部存放多个py文件(模块文件),仅仅知识为了更方便的管理模块文件 -
具体使用 import 包名 ? 导入包名其实导入的是里面的双下init.py文件(该文件相当于是这个包的管家,它那有什么 我们才能从它那获取什么)
在python3解释器中,其实包文件夹中有没有双下init.py已经无所谓了,都是包
但是在python2版本解释器中,文件下面必须要有双下init.py文件才能当作包
3、编程的思想转变
- 小白阶段:
按照需要从上往下堆写代码,俗称:面条版 在单文件中编写 - 函数阶段:
将代码按照功能的不同,封装成不同的函数模块阶段 在单文件中编写 - 模块阶段:
根据功能的不同,拆分为不同的模块文件 在多文件中编写
可以更加高效的管理,修改项目代码
4、软件开发目录规范
当模块文件多了我们还需要有文件夹
我们创建文件夹目录都有一定的规范
文件名 | 其中创建的文件 | 作用 |
---|
bin文件夹 | start.py | 用于存储启动程序的文件 | conf文件夹 | settings.py | 用于存储程序的配置文件 | core 文件夹 | src.py | 用于存储核心的逻辑功能 | lib文件夹 | common.py | 用于存储公共文件 | db文件夹 | userinfo.py | 用于存储程序的数据 | log文件夹 | log,log | 用于存储程序的日记 | interface文件夹 | user.py order.py goods.py | 用于存储程序的接口文件 | readme | 文本文件 | 用于存储程序的说明、介绍、广告,类似于说明书 | requierments | 文本文件 | 用于程序所需的第三方模块名和版本 |
扩展知识
我们在编写代码的时候,可以不完全遵循上面的文件名。
start.py可以放在bin文件下也可以直接放在项目根目录。
db文件夹等我们学到了真正的项目会被数据库软件替代。
log文件夹等我们学到真正的项目会被专门的日志服务替代.
5、常见内置模块
5.1 callections 模块
- namedtuple 具名
生成可以使用名字来访问元素内容的tuple
from collections import namedtuple
point=namedtuple('二维坐标系',['x','y'])
res_1=point(2,5)
res_2=point(25,80.3)
print(res_1,res_2)
>>>>>>>>>>>>>>>>>>>>>>>>
二维坐标系(x=2, y=5) 二维坐标系(x=25, y=80.3)
from collections import namedtuple
porint=namedtuple('三维坐标','x y z')
res_1=porint(5,5,6)
res_2=porint(9,9,9)
print(res_1, res_2)
>>>>>>>>>>>>>>>>>>>>>>>>
三维坐标(x=5, y=5, z=6) 三维坐标(x=9, y=9, z=9)
- deque 双端队列
可以从左右两边添加或删除元素
from collections import deque
dt1=deque()
dt1.append(111)
dt1.append(222)
dt1.append(333)
dt1.appendleft(444)
print(dt1)
dt1.popleft()
dt1.pop()
print(dt1)
>>>>>>>>>>>>>>>>>>>>>>>>>>
deque([444, 111, 222, 333])
deque([111, 222])
- ordereddict 有序字典
可以将 字典变得有序,顺序按键值添加的顺序
from collections import OrderedDict
od_1=OrderedDict([('a',1),('c',2),('d',3)])
print(od_1)
- defaultdict
可以有效的减少字典报错
lst= ['A', 'B', 'C', 'D', 'e']
dic = defaultdict(int)
res=1
for i in lst:
dic[i] +=1
print(dic)
>>>>>>>>>>>>>>>>>>>>>>>>>>
defaultdict(<class 'int'>, {'A': 1, 'B': 1, 'C': 1, 'D': 1, 'e': 1})
- counter 元素计数
可以将容器中元素进行计数,元素与个数作为键值对 组成字典形式返回
list=[5,4,4,6,4,5,6,1,3,5,1,1,]
res = 'abcdeabcdabcaba'
from collections import Counter
res1 = Counter(res)
res2=Counter(list)
print(res1,res2)
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Counter({'a': 5, 'b': 4, 'c': 3, 'd': 2, 'e': 1}) Counter({5: 3, 4: 3, 1: 3, 6: 2, 3: 1})
5.2、time 时间模块
- time.time 时间戳
输出一个时间戳
import time
print(time.time())
>>>>>>>>>>>>>>>>>>>>>>>>>>>>
1657790564.1788387
- time.gmtime 结构化时间
输出当前 结构化时间 或将时间戳转结构化时间
import time
print(time.gmtime())
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
time.struct_time(tm_year=2022, tm_mon=7, tm_mday=14, tm_hour=10, tm_min=27, tm_sec=13, tm_wday=3, tm_yday=195, tm_isdst=0)
- time.strftme 格式化时间
输出当前格式化时间 或将结构化时间转为格式化时间
print(time.strftime('%y-%m-%d %H:%M:%S'))
>>>>>>>>>>>>>>>>>>>>>>>>>>>
22-07-14 18:36:04
res=time.localtime()
print(res)
print(time.strftime('%y-%m-%d %H:%M:%S',res))
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
time.struct_time(tm_year=2022, tm_mon=7, tm_mday=14, tm_hour=18, tm_min=53, tm_sec=38, tm_wday=3, tm_yday=195, tm_isdst=0)
22-07-14 18:53:38
- time.strptime 格式化转结构化
格式化时间转为结构化时间
print(time.strptime('22-07-14 18:36:04','%y-%m-%d %H:%M:%S'))
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
time.struct_time(tm_year=2022, tm_mon=7, tm_mday=14, tm_hour=18, tm_min=36, tm_sec=4, tm_wday=3, tm_yday=195, tm_isdst=-1)
|