第一次个人编程作业
PSP
PSP2.1 | Personal Software Process Stages |
预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 50 | 100 |
Estimate | 估计这个任务需要多少时间 | 50 | 100 |
Development | 开发 | 1170 | 1363 |
Analysis | 需求分析 (包括学习新技术) |
60 | 148 |
Design Spec | 生成设计文档 | 100 | 120 |
Design Review | 设计复审 | 50 | 60 |
Coding Standard | 代码规范 (为开发制定合适的规范) |
40 | 55 |
Design | 具体设计 | 220 | 150 |
Coding | 具体编码 | 420 | 600 |
Code Review | 代码复审 | 130 | 150 |
Test | 测试 (自我测试,修改,提交修改) |
150 | 180 |
Reporting | 报告 | 120 | 130 |
Test Report | 测试报告 | 40 | 60 |
Size Measurement | 计算工作量 | 30 | 40 |
Postmortem & Process Improvement Plan |
事后总结 并提出过程改进计划 |
50 | 30 |
合计 | 1340 | 1593 |
解题思路
- 首先想到的是用什么语言来写,在看到题目的时候,想到了用正则表达式,因为暑假的时候学了爬虫,里面正好用了正则表达式来查找,所以我就选择了python。
- 先利用正则表达式把11位电话号码找到,并用spilt函数分离出来。
- 利用名字和地址中间有,来把名字和地址分离出来,得到名字同时得到了一大块的地址
- 一开始要调用百度或者高德地图的api来试一下匹配,看到群里说匹配度不高就没有选择用这个来做。后面选择了利用所有的省市县json文件里的内容对地址进行一级一级的匹配,但是当时还不知道具体要怎么实现。
- 想到方法以后我就去查找了正则表达式、python的语法(学了和没有学差不多,好多语法都不记得了)、json文件怎么使用、以及怎么进行一层一层的list查找(找了好多的资料,都没有太大的用处,后面使用json对象了来一级一级匹配。
设计实现过程
程序的流程:
函数 | 作用 |
---|---|
def getlevel(s) | 获取等级 |
def getname(s) | 抽取名字 |
def getphone(s) | 抽取电话号码 |
def getdetailaddress(ss, phone) | 获得整块地址 |
def cutSame(address, province) | 删除相同的地址部分 |
def getroad(new4) | 利用正则得到第五级地址 |
def getnumber(new6) | 利用正则得到第六级地址 |
def findarea(aareas,new2) | 找到确实的县级 |
有一个结果类result和一个结果字典data(写道后面发现两个只要有一个就好了)。这些函数都是按照我的思路一个一个写下来的,这是我的主要的代码思想,等到后面测试的时候加了直辖市的判断,还有根据等级来进行相应的输入输出。还有补充了县级和乡/街/镇级缺失的情况(之前一直都没有发现)
性能分析图:
利用pylint对代码进行分析的得分
来自Codacy(不知道干嘛但是分析了的图)
分数有5.37/10,Pylint 是一个 Python 代码分析工具,它分析 Python 代码中的错误,查找不符合代码风格标准和有潜在问题的代码。事实证明我的代码在许多方面需要进行改进,不能只注重结果的实现,还需要注意一些潜在问题。改进程序性能: 程序中消耗最大的函数就是input()函数,占了绝大部分。可能这就是我把十几万行的json文件都放进去的代价吧。(只能硬搞了)
代码说明
省级查找
for province in data_json: #省份
one = address[0] + address[1]
if province['name'].find(one) != -1: # 是他的子集
# print("yes,i find province")
result.province = province['name']
#print(result.province)
new1 = cutSame(address, result.province)
#print(new1)
#如果是直辖市的话
if result.province == "北京"or result.province == "重庆"or result.province == "天津"or result.province == "上海":
new1 = result.province + new1
cities = province['children']
市级的查找
for city in cities: #市
two = new1[0] + new1[1]
if city['name'].find(two) != -1 :
result.city = city['name']
#print(result.city)
new2 = cutSame(new1,result.city)
# print(new2)
areas = city['children']
#print(areas)
new3 = new2
县级的缺失
def findarea(aareas,new2):
#areas是现在的所有的县,new2是现在只有乡以后的地址
atown = new2[0]+new2[1]
#print(atown)
for aarea in aareas:#县
atowns = aarea['children']
for aatown in atowns:#县下面的镇/乡
if aatown['name'].find(atown) != -1:
#print(aatown['name'])
return aarea['children']
模块部分单元测试展示
首先是代码:
class MyTestCase(unittest.TestCase):
def test_cutSame(self):
cut = tt.cutSame("福建省","福建")
self.assertEqual( cut,"省")
cut = tt.cutSame("闽侯县", "闽侯")
self.assertEqual(cut, "县")
cut = tt.cutSame("鼓楼区","鼓楼")
self.assertEqual( cut,"区")
cut = tt.cutSame("乌鲁木齐市", "乌鲁木齐")
self.assertEqual(cut, "市")
def test_getroad(self):
cut = tt.getroad("湖滨路110号湖滨大厦一层")
self.assertEqual(cut,"湖滨路")
cut = tt.getroad("五一北路123号福州鼓楼医院")
self.assertEqual(cut, "五一北路")
cut = tt.getroad("东大街1号北京市东城区人民法院")
self.assertEqual(cut, "东大街")
def test_getnumber(self):
cut = tt.getnumber("110号湖滨大厦一层")
self.assertEqual(cut,"110号")
cut = tt.getnumber("123号福州鼓楼医院")
self.assertEqual(cut, "123号")
cut = tt.getnumber("1号北京市东城区人民法院")
self.assertEqual(cut, "1号")
if __name__ == '__main__':
unittest.main()
然后是覆盖率:
最后,我测试了我的将地址和匹配到的信息进行消去相同的,即除去子集。测试是不是每一级都能很好的使用。还有测试了最后的正则表达式来分割最后两级的函数是否是可行的。
模块部分异常处理说明
一开始的时候没有太考虑到异常处理,就一步一步写下来了,就想着其他的分不要了得情况。到了后面再回来追溯的时候就追悔莫及!!!因为异常处理没有做好导致了我代码提交上去,评测的时候没有成绩出来。改了不下十次!!!
- 等级判断不出来的时候按照七级来划分。
- 小张,福18150632336建福州龙江街道福山路.
- 永福后面的例子更新了!!!我发现省也是可以缺失的!由于我没有判断,造成了错误。后面加上去才过了!
- 3!牛多搓,来宾市金秀瑶15029285452族自治县六巷乡六巷街1号六巷乡人民政府.
- 还有就是到号也会缺失,在调用函数的时候也会出错,造成正则表达式找不到结果
- 2!戚形亮,河北省15184451587张家口怀安县头百户镇头百户派出所.
- 还有第六级地址划分的时候,找不到相应的关键词的时候,正则表达式也会出错。。。(哭了)
- 2!曾阀犬,天津河东区唐家口街道成林道63号天津工业大学15755715952.
心路历程与收获
一开始看到这个连题目读下来都费劲的编程作业的时候,心里很是崩溃啊!崩溃了一天,觉得这个作业就是在为难我啊。我甚至想到了大一下的时候张栋老师布置的电梯的作业,当时没有成功的做出来,每天也都是崩溃的。那时候对于现在的我来说也是有些遗憾的。这次我后面想着做还是需要做的,所以就去查了资料。不查不知道难啊!!一查我的头就大了,发现我之前学的知识真的是太少了,而且缺少实践,很多东西都是听说过但是没有实际的应用,到了后面看到了庆焰的博客,才想起来原来可以用我暑假学的正则表达式(简直是我的救星),为我的程序提供了思路。到后面所有的功能一步一步的实现的时候,我掉进了许多的bug中,从开始不知道怎么改,死皮赖脸的去问庆焰,到后面会自己去思考去尝试,我想这也许是我的进步吧。到后面程序的不断完善考虑的方面的不断深入,都一步一步的坚持下来了。感谢那些给我意见和建议的大佬们啊!