1.Github地址
2.PSP表格:
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 60 | 85 |
· Estimate | · 估计这个任务需要多少时间 | 60 | 85 |
Development | 开发 | 2010 | 1970 |
· Analysis | · 需求分析 (包括学习新技术) | 420 | 480 |
· Design Spec | · 生成设计文档 | 60 | 40 |
· Design Review | · 设计复审 | 100 | 40 |
· Coding Standard | · 代码规范 (为目前的开发制定或选择合适的规范) | 30 | 90 |
· Design | · 具体设计 | 300 | 100 |
· Coding | · 具体编码 | 720 | 700 |
· Code Review | · 代码复审 | 80 | 160 |
· Test | · 测试(自我测试,修改代码,提交修改) | 300 | 360 |
Reporting | 报告 | 140 | 145 |
· Test Repor | · 测试报告 | 70 | 60 |
· Size Measurement | · 计算工作量 | 20 | 25 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出改进计划 | 50 | 60 |
· 合计 | 2210 | 2200 |
3.解题思路
我是一个菜鸟。
实话实说,刚拿到题目我就傻了,首先是这题目有点长了,也是第一次接触到地址解析这类题目,其次,我所掌握的语言也是实在太少,用C++我根本无法实现。所以,当时内心是没什么想法的,之后求助了我隔壁宿舍的一些朋友,大家都说python简单点??随后我打算自学一下python。
因为之前杨明哲在我的博客里有评论过,希望我和外校的朋友多沟通交流,寻求一些学习机会和资源。我认为是时候付诸实践了。所以我也向我的高中同学咨询了一些关于python快速学习和这次作业的总体架构的问题。
在之后在B站上学了许多网课,看了不懂几篇CSDN,加了几个python交流群,为我的开冲备足了马力(其实还是不怎么会,但是感觉很不错)
然后,冲!
代码设计和功能实现
我的代码设计结构比较简单,共四个函数,引用了三个库。
首先split_name和split_num用正则表达式提取名字和手机号码,solve_5函数解决级别1的地址,solve_7函数用来对付级别2和级别3的地址。因为其实是后来才看到王永福同学的输入输出要求才改了代码,本来只设计了solve这一个函数。solve_5和solve_7有个共同点,也是其中的关键一环,就是用cpca库把地址的前三级行政区提取出来映射到tmp这个字典里(调了很久,因为这个函数的输入格式要用列表,如果直接给字符串的话他会把字符串分为一个一个去识别,这样就识别失败了,所以必须要列表才能映射)。
函数里之后的代码就是判断地址里是否有“镇乡街道路巷”,如果有就提取出来,然后把他们放到相应的变量名里,把剩下的东西放到addr1里。之后创建addr就是我们目标地址的这个列表,里面有五个元素,再判断,如果我们有存元素进去,就把他加到相应位置里。最后,将信息打包成json文件。对了,我还设计了三个level去判断级别,当然,不同的级别对应不同的函数。
如果一定要说关键,那一定是正则表达式和python的字符串处理和分割了,这里要感谢B站的网课和我的老同学。尤其纠结的其中一个问题是在提取电话号码的时候,正则表达式的两个结果被号码分开,电话号码直接提出来之后,分开了的两段成为两个列表,放置在match里。另外一个就是python数字默认是字符串,在这里测试的时候我的代码疯狂报错,这个其实是我掌握不牢靠的知识点,我后来整段代码发给同学纠错才搞定。
独到之处就是,设计简单,我学的不多,所以代码主要以实现需求为主,结果就是结构明了,思路不容易被打断。另外想说一个难点,cpca库返回的结果df是数据帧格式。这个格式显然是不行的,然后我是用那个iloc提取然后转换成字典格式。
4.性能改进
码到这里我都不知道自己在码什么,我先是使用了pycharm专业版的profile功能生成了一张性能分析图(如下),发现果不其然除了系统的input耗时以外,solve_7是程序中消耗最大的函数。于是我也不知道要做什么改进我这里做的改进就是在这个函数中大部分引用solve_5的内容,实际上列表里填了三个元素后,后两个元素引空串,并且在列表中留一个空串给solve_7的append,我想这样这个函数冲起来会更自由自在一些吧。
5.单元测试展示
2!李四,福建省福州13756899511市鼓楼区鼓西街道湖滨路110号湖滨大厦一层.
{"姓名": "李四", "手机": "13756899511", "地址": ["福建省", "福州市", "鼓楼区", "鼓西街道", "湖滨路", "110号", "湖滨大厦一层"]}
1!张三,福建福州闽13599622362侯县上街镇福州大学10#111.
{"姓名": "张三", "手机": "13599622362", "地址": ["福建省", "福州市", "闽侯县", "上街镇", "福州大学10#111"]}
2!王五,福建省福州市鼓楼18960221533区五一北路123号福州鼓楼医院.
{"姓名": "王五", "手机": "18960221533", "地址": ["福建省", "福州市", "鼓楼区", "", "五一北路", "123号", "福州鼓楼医院"]}
3!小美,北京市东15822153326城区交道口东大街1号北京市东城区人民法院.
{"姓名": "小美", "手机": "15822153326", "地址": ["北京市", "北京市", "东城区", "交道口东大街", "", "1号", "北京市东城区人民法院"]}
1!小陈,广东省东莞市凤岗13965231525镇凤平路13号.
{"姓名": "小陈", "手机": "13965231525", "地址": ["广东省", "东莞市", "", "凤岗镇", "凤平路13号"]}
2!拉克丝,新疆维吾尔自治区阿克12345678954苏地区阿克苏市金土地农哈哈大世界交通路25号金土地大厦.
{"姓名": "拉克丝", "手机": "12345678954", "地址": ["新疆维吾尔自治区", "阿克苏地区", "阿克苏市", "", "金土地农哈哈大世界交通路", "25号", "金土地大厦"]}
2!小黑,福建省龙岩13756899511市新罗区南城街道小溪路109号黑哥花园.
{"姓名": "小黑", "手机": "13756899511", "地址": ["福建省", "龙岩市", "新罗区", "南城街道", "小溪路", "109号", "黑哥花园"]}
1!刘湖,吉林省白山市六道江镇西村药店18694520738.
{"姓名": "刘湖", "手机": "18694520738", "地址": ["吉林省", "白山市", "", "六道江镇", "西村药店"]}
1!梁钓睡,江西省九江修水县208县道征村乡熏衣村村民委员13510061140会.
{"姓名": "梁钓睡", "手机": "13510061140", "地址": ["江西省", "九江市", "修水县", "208县道征村乡", "熏衣村村民委员会"]}
1!陈敲,18770445535北京市顺义区石园街道顺康路1号港馨家园19号楼.
{"姓名": "陈敲", "手机": "18770445535", "地址": ["北京市", "北京市", "顺义区", "石园街道", "顺康路1号港馨家园19号楼"]}
测试覆盖率
此处直接调用python的coverage模块,执行代码覆盖率的统计。
6.异常处理
[1]最开始的我简直是铁憨憨,没看到输入相应要求,没有分等级,所有的地址都用七级分址。之后将三个等级分别在主函数初始判断,再进行操作。
[2]这里是误以为“街道”是和“路、巷、道”等同一级,之后作了修正,不得不说我的地理知识更上了一层楼。(包括末尾的句号,在solve函数开始时将其消除)
[3]这里的代码属于凌晨两三点吧,昏昏沉沉。不但分级还未完成,分址的时候少附了一个。之后添加三个level进行判断级别。之后改变了一个逻辑,调了快半小时才实现七级。
[4]在之后的评测里也出现了异常,后来我在git、cmd、pycharm里都安装了cpca库,毕竟没有它我的代码就没有了灵魂。
7.完善PSP表格
心路历程与收获
退选退选!!这次作业太刺激了。其实刚看到题目的时候我是自闭的,现在一波下来我还是有点自闭。第一感受就是后悔暑假没有好好学习python和java,要不然今天也不会如此狼狈。其次就是回答第一次博客的问题,“凌晨四点还在打代码是什么感受?”,答案是:困。
收获其实还是蛮大的,如果不是这次作业我也没法逼自己去学习到那么多东西,也不会获得和许多大佬交流的机会。
最后我想说,大三才刚开始,果子估计不会太甜,冲到就是赚到!