第一次个人编程作业

第一次编程作业仓库地址

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中,从开始不知道怎么改,死皮赖脸的去问庆焰,到后面会自己去思考去尝试,我想这也许是我的进步吧。到后面程序的不断完善考虑的方面的不断深入,都一步一步的坚持下来了。感谢那些给我意见和建议的大佬们啊!

posted @ 2019-09-17 18:12  陈秋琴  阅读(306)  评论(8编辑  收藏  举报