第一次个人编程作业
一、源码
Github地址:https://github.com/wjx-1999/031702547
二、psp表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 30 | 30 |
· Estimate | · 估计这个任务需要多少时间 | 30 | 30 |
Development | 开发 | 600 | 800 |
· Analysis | · 需求分析 (包括学习新技术) | 50 | 50 |
· Design Spec | · 生成设计文档 | 40 | 40 |
· Design Review | · 设计复审 | 30 | 30 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 30 | 30 |
· Design | · 具体设计 | 50 | 60 |
· Coding | · 具体编码 | 400 | 500 |
· Code Review | · 代码复审 | 100 | 120 |
· Test | · 测试(自我测试,修改代码,提交修改) | 150 | 120 |
Reporting | 报告 | 30 | 30 |
· Test Repor | · 测试报告 | 30 | 30 |
· Size Measurement | · 计算工作量 | 15 | 20 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 20 | 30 |
· 合计 | 1605 | 1920 |
三、计算模块接口的设计与实现过程
前期准备
首先接触到这个问题,最初是想要使用c++来实现的,后来发现输出还要用json的格式,要用c++手写json的输出,并参考了其他大佬的c++做法,这简直是噩梦难度,于是放弃了。暑假期间稍微学习了一部分的python,这时候就派上用场了。py里面有re、json、cpca模块,大大简化了问题难度。
导入模块 | 主要功能 |
---|---|
re | 提供各种正则表达式的操作 |
json | 将输出文件的格式转换为json |
cpca | 用于提取简体中文字符串中省,市和区 |
思路
- 首先我们使用正则表达式,将输入的字符串切割得到姓名、电话、剩余的字符串s1
- 接着使用cpca,将s1切割,得到了省、市、区、剩余部分s2
- 对于剩余的部分,手动在分出镇、街道、乡等信息,得出一个五级地址
模块接口设计
接口 | 主要功能 |
---|---|
match_name_tel | 得到姓名、电话信息 |
transform | 提取简体中文字符串中省,市和区 |
address_book | 得出五级地址 |
json.dumps | 输出json格式的数据 |
实现过程
得到姓名、电话、和省市区信息,相当于得到三级地址
def match_name_tel(s: str): # get name and phone number
s = s.rstrip(".")
match = s.split(",")
name = match[0] #get name
tel = re.search('\d{11}', match[1]).group(0) #get phone number
mat = re.split('\d{11}', match[1])
rest_addr = mat[0] + mat[1] # join two string
DataFrame = cpca.transform([rest_addr]) # use the ilst
return (name, tel, DataFrame)
剩余字串切割,得到五级地址
def address_book(str0 : str):
name, phone, tmp = match_name_tel(str0)
newaddr = []
str_rest = tmp.values[0]
for addr in str_rest:
newaddr.append(addr)
# split the street\town\village
lastaddr = newaddr.pop()
if newaddr[0] == '北京市' or'天津市'or'上海市'or '重庆市' :
str = newaddr[0].replace('市','')
newaddr[0] = str
address = newaddr
addr_rest = lastaddr.split('街道', 1)
if len(addr_rest) > 1:
addr_rest[0] += "街道"
else:
addr_rest = lastaddr.split('镇', 1)
if len(addr_rest) > 1:
addr_rest[0] += "镇"
else:
addr_rest = lastaddr.split('乡', 1)
if len(addr_rest) > 1:
addr_rest[0] += "乡"
else:
addr_rest.insert(0, '')
address = newaddr + addr_rest
info = {
"姓名": name,
"手机": phone,
"地址": address
}
# get the json type data
info_data = json.dumps(info, ensure_ascii=False)
print(info_data)
四、计算模块接口部分的性能改进
主要时间除了输入部分,主要就是直接调用cpca的transform函数,几乎占用了全部时间,除非我自己手动分析写一个类似的函数(主要还是懒啊),不然基本无法降低时间
这是用pycharm的profile出来的图片
五、计算模块部分单元测试展示
部分例子
1!伯诽,浙江杭州市下城区石桥街道石桥路344号天堂园社区汽轮宿14784456463舍5幢.
1!蔡细披,上海市奉贤区泽丰路88弄恒13538603055盛豪庭.
1!谢逐,广东省汕头澄海区竹林村德生巷8号竹林幼儿园13893984659.
1!徐籍,天津市宁河区大15509925167北涧沽镇大北路宁河区大北涧沽镇中兴沽村村民委员会.
1!乜吨铡,安徽省合肥市瑶海区长15646257573淮街道胜利路198号合肥元一希尔顿酒店.
{"姓名": "伯诽", "手机": "14784456463", "地址": ["浙江省", "杭州市", "城区", "下城区石桥街道", "石桥路344号天堂园社区汽轮宿舍5幢"]}
{"姓名": "蔡细披", "手机": "13538603055", "地址": ["上海", "上海市", "奉贤区", "", "泽丰路88弄恒盛豪庭"]}
{"姓名": "谢逐", "手机": "13893984659", "地址": ["广东省", "汕头市", "澄海区", "", "竹林村德生巷8号竹林幼儿园"]}
{"姓名": "徐籍", "手机": "15509925167", "地址": ["天津", "天津市", "", "宁河区大北涧沽镇", "大北路宁河区大北涧沽镇中兴沽村村民委员会"]}
{"姓名": "乜吨铡", "手机": "15646257573", "地址": ["安徽省", "合肥市", "瑶海区", "长淮街道", "胜利路198号合肥元一希尔顿酒店"]}
单元测试覆盖率
六、计算模块部分异常处理说明
这个算法对于附加题部分时间没有继续做,他对于一些要输出七级的地址就会产生错误,后面需要花费时间继续完善
3!蒯刑浦,白城市洮南市团结街道兴安南街5566号安泰社区公13949401891共事务服务中心.
{"姓名": "蒯刑浦", "手机": "13949401891", "地址": ["吉林省", "白城市", "洮南市", "团结街道", "兴安南街5566号安泰社区公共事务服务中心"]}
七、PSP表格
见第二点。
总结
这次的个人编程作业,花费了许多的时间,比预期要多很多的时间,从复习py的语法知识,搭建环境,测试样例,验证结果等等,让自己对于py有了更近一步的深入了解。自己平时时间大部分都在实验室,应该要适当的平衡实验室与平时作业的关系,不能总是在最后时刻完成。