软件开发目录规范、python常用内置模块
编程思想的转变
1.面条版阶段
所有的代码全部堆叠在一起。可以看成是直接将所有的数据放在C盘
视频、音频、文本、图片
2.函数版阶段
根据功能的不同封装不同的函数。可以看成是将C盘下的数据分类管理
视频文件夹、音频文件夹、文本文件夹、图片文件夹
3.模块版阶段
根据功能的不同拆分成不同的py文件。可以看成是将C盘下的数据根据功能的不同划分到更合适的位置
系统文件夹 C盘、视频文件夹 D盘、图片文件夹 E盘
- ps:类似于开公司(小作坊>>>小公司>>>上市公司)
目的:更方便快捷高效的管理资源
软件开发目录规范
为了提高程序的可读性和可维护性,我们应该为软件设计良好的目录结构,这与规范的编码风格同等重要。软件的目录规范并无硬性标准,只要清晰可读即可。
目录的规范优点
1.可读性高: 不熟悉这个项目的代码的人,一眼就能看懂目录结构,知道程序启动脚本是哪个,测试目录在哪儿,配置文件在哪儿等等。从而非常快速的了解这个项目。
2.可维护性高: 定义好组织规则后,维护者就能很明确地知道,新增的哪个文件和代码应该放在什么目录之下。这个好处是,随着时间的推移,代码/配置的规模增加,项目结构不会混乱,仍然能够组织良好。
文件分类详细
1.bin文件夹:
- 用于存储程序的启动文件
>>>>>start.py 启动文件可以放在bin目录下,也可以直接在项目根目录
2.conf文件夹:
- 用于存储程序的配置文件
settings.py 里面存放项目的默认配置,一般都是全大写
3.core文件夹:
- 用于存储程序的核心逻辑
src.py 里面存放项目核心功能
4.lib文件夹:
- 用于存储程序的公共功能
common.py
5.db文件夹:
- 用于存储程序的数据文件
userinfo.txt
db_handler.py 存放数据库操作相关的代码
6.log文件夹:
- 用于存储程序的日志文件
log.log
7.interface文件夹:
- 用于存储程序的接口文件
user.py order.py goods.py
8.README文件(文本文件):
- 用于存储程序的说明、介绍、广告(类似于产品说明书)
9.requirements.txt文件:
- 用于存储程序所需的第三方模块名称和版本
README文件说明
README文件是每个项目都应该有的一个文件
目的:能简要描述该项目的信息,让读者快速了解这个项目
需要说明以下几个事项:
- 软件定位,软件的基本功能
- 运行代码的方法:安装环境、启动命令等
- 简要的使用说明
- 代码目录结构说明,更详细点可以说明软件的基本原理
- 常见的问题说明
requirements.txt文件说明
- 这个文件的存在是为了方便开发者,维护软件的依赖库,我们需要的第三方库都可以写进去,pycharm非常智能,会通过识别版本号以及包名导入,这样也方便我们查看使用了哪些python包。
注意:在编写软件的时候,可以不完全遵循上面的文件名
- start.py可以放在bin文件夹下也可以直接放在项目根目录下
- db文件夹等学到真正的项目会被数据库软件替代
- log文件夹等学到真正的项目会被专门的日志服务替代
常用内置模块之collections模块
在内置数据类型(dict、list、set、tuple)的基础上,collections模块还提供了几个额外的数据类型:Counter、deque、defaultdict、namedtuple和OrderedDict等。
- namedtuple:具名元组,生成可以使用名字来访问元素内容的元组
- deque:双端队列,可以快速的从另一侧追加和推出对象
- Counter:计数器,主要用来计数
- OrderedDict:有序字典
- defaultdict:带有默认值的字典
namedtuple
from collections import namedtuple
point = namedtuple('二维坐标系',['x','y'])
p1 = point(1, 3) print(p1) # 二维坐标系(x=1, y=3) print(p1.x) # 1 print(p1.y) # 3 point = namedtuple('三维坐标系',['x', 'y', 'z'])
p2 = point(2, 5, 6) print(p2) # 三维坐标系(x=2, y=5, z=6) print(p2.x) # 2 print(p2.y) # 5 print(p2.z) # 6 c = namedtuple('扑克牌', ['花色', '点数'])
c1 = c('', 'A')
c2 = c('', 'A') print(c1) # 扑克牌(花色='', 点数='A') print(c2) # 扑克牌(花色='', 点数='A')
deque
使用list存储数据时,按索引访问元素很快,但是插入和删除元素就很慢了,因为list是线性存储,数据量大的时候,插入和删除效率很低。
deque是为了高效实现插入和删除操作的双向列表,适合用于队列和栈:
from collections import deque q = deque()
q.append(111)
q.append(222)
q.append(333)
print(q) # deque([111, 222, 333]) q.appendleft(555)
print(q) # deque([555, 111, 222, 333])
deque除了实现list的append()
和pop()
外,还支持appendleft()
和popleft()
,这样就可以非常高效地往头部添加或删除元素。
Counter
Counter类的目的是用来跟踪值出现的次数。它是一个无序的容器类型,以字典的键值对形式存储,其中元素作为key,其计数作为value。计数值可以是任意的Interger(包括0和负数)。Counter类和其他语言的bags或multisets很相似。
例:统计字符串中每个字母出现的次数:
s = 'abccbbbacaacbcab'
方法1:
s = 'abccbbbacaacbcab'
d = {}
for i in s:
if i not in d:
d[i] = 1
else:
d[i] += 1
print(d) # {'a': 5, 'b': 6, 'c': 5}
方法2:
from collections import Counter s = 'abccbbbacaacbcab'
print(Counter(s)) # Counter({'b': 6, 'a': 5, 'c': 5})
OrderedDict
使用dict时,Key是无序的。在对dict做迭代时,我们无法确定Key的顺序。
如果要保持Key的顺序,可以用OrderedDict
:
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)])
defaultdict
defaultdict是对Python中字典dict的改善
如果是字典dict:用法是dict={},
添加元素是dict[element]=value
调用是dict[element]
但是前提是element是存在于字典的,不然会报错误KeyError错误。
对于这种情况,defaultdict就可以避免这个错误,defaultdict的作用是在于,当字典里的element不存在但被查找时,返回的不是keyError而是一个默认值。
例:有一个列表:l1 = [11, 22, 33, 44, 55, 66, 77, 88, 99],将所有小于60的数保存到字典的第一个键中,将所有小于60的数保存到字典的第二个键中,即{'k1': 小于60的数,'k2': 大于60的数}
方法1:
l1 = [11, 22, 33, 44, 55, 66, 77, 88, 99]
d1 = {'k1':[], 'k2': []}
for i in l1:
if i < 60:
d1.get('k1').append(i)
else:
d1.get('k2').append(i)
print(d1) # {'k1': [11, 22, 33, 44, 55], 'k2': [66, 77, 88, 99]}
方法2:(用得不多)
from collections import defaultdict
res = defaultdict(k1=[i for i in l1 if i < 66], k2=[i for i in l1 if i >= 66])
print(res) # defaultdict(None, {'k1': [11, 22, 33, 44, 55], 'k2': [66, 77, 88, 99]})
使用dict
时,如果引用的Key不存在,就会抛出KeyError
。如果希望key不存在时,返回一个默认值,就可以用defaultdict
:
from collections import defaultdict
d = defaultdict(lambda: 'N/A')
d['key1'] = 'abc'
print(d['key1']) # key1存在 'abc'
print(d['key2']) # key2不存在,返回默认值 'N/A'
常用内置模块之时间模块
在Python中,通常有这三种方式来表示时间:时间戳、结构化时间(struct_time)、格式化时间字符串:
1. 时间戳(Timestamp) :通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量。我们运行“type(time.time())”,返回的是float类型。
import time # 导入时间模块
time.time() # 时间戳
print(time.time()) # 1666168231.4251723
2. 结构化时间(主要给计算机看的,用得少)
3. 格式化时间
time.strftme()
格式化符号:"%Y-%m-%d %H:%M:%S" 或 "%Y-%m-%d %X"
import time # 导入时间模块
print(time.strftime('%Y-%m-%d %H:%M:%S')) # 2022-10-19 16:38:09
print(time.strftime('%Y-%m-%d %X')) # 2022-10-19 16:38:09
几种时间之间的相互转换
datetime模块
import datetime # 导入datetime模块
print(datetime.datetime.now()) # 获取当前时间 2022-10-19 16:53:26.651335 print(datetime.datetime.today()) # 获取当前时间 2022-10-19 16:53:26.651335 print(datetime.date.today()) # 获取当前日期 2022-10-19
from datetime import date, datetime # 导入模块
print(date.today()) # 获取当前日期 2022-10-19
print(datetime.today()) # 获取当前时间 2022-10-19 16:58:13.340812
指定日期时间
c = datetime.datetime(2017, 5, 23, 12, 20)
# print('指定日期:',c) # 指定日期: 2017-05-23 12:20:00
把不规则的时间转化为固定的格式
from datetime import datetime
d=datetime.strptime('2017/9/30','%Y/%m/%d')
print(d) # 2017-09-30 00:00:00 e=datetime.strptime('2017年9月30日星期六','%Y年%m月%d日星期六')
print(e) # 2017-09-30 00:00:00 f=datetime.strptime('2017年9月30日星期六8时42分24秒','%Y年%m月%d日星期六%H时%M分%S秒')
print(f) # 2017-09-30 08:42:24
设置距离当前几天之后的时间
import datetime # 导入模块
time1 = datetime.date.today() # 设置当前模块
print(time1)
d_time = datetime.timedelta(days=3) # 设置时间差值
print(time1 + d_time) # 打印距离当前时间3天以后的时间
import datetime # 导入模块
time1 = datetime.date.today() # 设置当前模块
print(time1) # 2022-10-19
d_time = datetime.timedelta(days=3) # 设置时间差值
print(time1 + d_time) # 打印距离当前时间3天以后的时间 # 2022-10-22 time2 = datetime.datetime.today() # 设置当前模块
print(time2) # 2022-10-19 17:22:55.336720
d_time = datetime.timedelta(minutes=20) # 设置时间差值
print(time2 + d_time) # 打印距离当前时间20分钟以后的时间 # 2022-10-19 17:42:55.336720
常用内置模块之随机数模块
- import random
import random print(random.random()) # 随机产生一个0-1之间的小数 0.4885910693172658 print(random.randint(1, 10)) # 随机产生一个1-10之间的整数 9 print(random.randrange(1,10, 2)) # 随机产生一个1-10之间的数,指定步长 3 print(random.choice(['一等奖', '二等奖', '三等奖', '谢谢惠顾'])) # 随机产生一个选项 一等奖 print(random.sample(['Alex', 'Bob', 'Cindy', 'Tony', 'Jason'], 2)) # 随机获取指数个数的样本 ['Alex', 'Bob'] l1 = [2, 3, 4, 5, 6, 7, 8, 9, 10, 'J', 'Q', 'K', 'A']
random.shuffle(l1) # 随机打乱数据集
print(l1) # ['Q', 10, 9, 'J', 2, 3, 4, 5, 'A', 6, 'K', 8, 7]
小练习:随机产生4位的图片验证码: 每一位都可以是大写字母、小写字母、数字 (搜狗公司的一道笔试题)
# 3. 循环取4次
for i in range(4):
# 1. 先产生随机的大写字母、小写字母、数字
random_upper = chr(random.randint(65,90))
random_lower = chr(random.randint(97, 122))
rand_int = str(random.randint(0, 9)) # 2. 随机三选一
temp = random.choice([random_upper, random_lower,rand_int])
print(temp,end='')
拔高:如果要随机产生不同位数的验证码呢:
>>>考虑函数传参:
def get_code(n):
code = ''
# 3. 循环取4次
for i in range(n):
# 1. 先产生随机的大写字母、小写字母、数字
random_upper = chr(random.randint(65,90))
random_lower = chr(random.randint(97, 122))
rand_int = str(random.randint(0, 9)) # 2. 随机三选一
temp = random.choice([random_upper, random_lower,rand_int])
code += temp
return code res = get_code(5) # 5位验证码,参数设置为5
print(res) res = get_code(10) # 10位验证码,参数设置为10
print(res)
软件开发目录规范、python常用内置模块的更多相关文章
- Python基础之模块:2、包的使用和软件开发目录规范及常用内置模块
目录 一.包的使用 1.什么是包 2.包的具体使用 1.常规导入 2.直接导入包名 二.编程思想转变 1.面条阶段 2.函数阶段 3.模块阶段 三.软件目录开发规范 1.bin 2.conf 3.co ...
- Python模块:Re模块、附软件开发目录规范
Re模块:(正则表达式) 正则表达式就是字符串的匹配规则 正则表达式在多数编程语言里都有相应的支持,Python里面对应的模块时re 常用的表达式规则:(都需要记住) “ . ” # 默认匹配除 ...
- python模块导入-软件开发目录规范-01
模块 模块的基本概念 模块: # 一系列功能的结合体 模块的三种来源 """ 模块的三种来源 1.python解释器内置的模块(os.sys....) 2.第三方的别人写 ...
- Python 浅谈编程规范和软件开发目录规范的重要性
最近参加了一个比赛,然后看到队友编程的代码,我觉得真的是觉得注释和命名规范的重要性了,因为几乎每个字符都要咨询他,用老师的话来说,这就是命名不规范的后续反应.所以此时的我意识到写一篇关于注释程序的重要 ...
- python 之 软件开发目录规范 、logging模块
6.4 软件开发目录规范 软件(例如:ATM)目录应该包含: 文件名 存放 备注 bin start.py,用于起动程序 core src.py,程序核心功能代码 conf settings. ...
- python基础语法10 函数递归,模块,软件开发目录规范
函数递归: 函数递归指的是重复 “直接调用或间接调用” 函数本身, 这是一种函数嵌套调用的表现形式. 直接调用: 指的是在函数内置,直接调用函数本身. 间接调用: 两个函数之间相互调用间接造成递归. ...
- python浅谈编程规范和软件开发目录规范的重要性
前言 我们这些初学者,目前要做的就是遵守代码规范,这是最基本的,而且每个团队的规范可能还不一样,以后工作了,尽可能和团队保持一致,目前初学者就按照官方的要求即可 新人进入一个企业,不会接触到核心的架构 ...
- Python记录13:软件开发目录规范
软件开发目录规范 开发一个软件,一个工程项目,一般应该具备以下的几个基本的文件夹和模块,当然,这并不是一成不变的,根据项目的不同会有一定的差异,不过作为一个入门级的新手,建议暂时按照以下的规范编写: ...
- py 包和模块,软件开发目录规范
目录 py 包和模块,软件开发目录规范 什么是包? 什么是模块? 软件开发目录规范 py 包和模块,软件开发目录规范 什么是包? 包指的是内部包__init__.py的文件夹 包的作用: 存放模块,包 ...
- day21 模块与包+软件开发目录规范
目录 一.导入模块的两种方式 二.模块搜索的路径的优先级 三.循环导入 四.区分py文件的两种用途 五.编写一个规范的模板 五.包 1 什么是包 2 为什么要有包 3 包的相关使用 3.1 在当前文件 ...
随机推荐
- 【前端必会】webpack loader 到底是什么
概述 webpack的使用中我们会遇到各种各样的插件.loader. webpack的功力主要体现在能理解各个插件.loader的数量上.理解的越多功力越深 loader是什么呢? 背景 了解load ...
- mapboxgl加载tiff
缘起 近期在项目中遇到这么一个需求,需要在地图上展示一组格网数据,格网大小为2m*2m,地图api用的mapboxgl.起初拿到这个需要感觉很easy,在地图上添加一个fill图层就好啦.把格网面数据 ...
- 工业互联网领域的企业,都已经接入了ERP或者MES系统了吗?
肯定不是得啊!之前的两化,后来的企业上云,到当下的智能制造.数字化转型,不都是想把制造业(也就是你说的工业互联网企业)往这个方向推么,ERP和MES是企业数字化的一部分,但不是全部,当然有的企业(小工 ...
- Linux下多线程创建
1.pthread_create Linux中线程创建用pthread_create函数 #include <pthread.h> int pthread_create( pthread_ ...
- C语言下for循环的一点技巧总结
for循环是普遍应用与各种计算机语言的一种循环方式. 一般情况下, for循环规则:for(条件一:条件二:条件三) 条件一为满足条件,也就是条件一为1时,进入这个for循环.条件二为循环条件,也就是 ...
- 2022最新版超详细的Maven下载配置教程、IDEA中集成maven(包含图解过程)、以及导入项目时jar包下载不成功的问题解决
文章目录 1.maven下载 2.maven环境变量的配置 3.查看maven是否配置成功 4.配置文件的修改 5.IDEA集成maven 6.导入项目时jar包下载不成功的问题解决 maven教程: ...
- python django搭建一个简易博客的解析(按照文件顺序逐一讲解)
上次讲解了一下各py文件的内容,但比较乱,所以这次整理了一个顺序版. 源代码请在http://github/Cheng0829/mysite自行下载 mysite: db.sqlite3:数据库文件. ...
- linux 2021
常用安装 sudo apt install openssh-server # 安装ssh service ssh # 查看ssh服务的 基础 Debian 是Ubuntu的母板,有强大的包管理功能,使 ...
- 对比entrypoint以及cmd
如何查看 现有 images 的 入口信息 docker image inspect image_id { "entrypoint": "xxx" " ...
- 一个基于角色的访问控制(RBAC)的简单示例
关于"基于角色的访问控制"是什么,本文不再赘述,如果不明白,请自行查阅资料了解. 本文参考用户·角色·权限·表的设计的思想设计. 本文用到的技术有Spring Boot.Sprin ...