第一次个人编程作业

Github仓库地址

PSP表格

PSP2.1 Personal SoftwareProcess Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 50 60
Estimate 估计这个任务需要多少时间 30 20
Development 开发 960 1080
Analysis 需求分析 (包括学习新技术) 180 210
Design Spec 生成设计文档 20 20
Design Review 设计复审 10 15
Coding Standard 代码规范 (为目前的开发制定合适的规范) 30 40
Design 具体设计 30 40
Coding 具体编码 180 160
Code Review 代码复审 10 5
Test 测试(自我测试,修改代码,提交修改) 30 25
Reporting 报告 10 10
Test Repor 测试报告 15 10
Size Measurement 计算工作量 5 15
Postmortem & Process Improvement Plan 事后总结, 并提出过程改进计划 10 15
合计 1570 1725

解题思路

想法1.0:拿到题目第一想法是暴力打表模拟,然后去百度找省市地址表,然后县级以后就无能为力了(是真的多),除非下一个地址包去层次遍历用find()匹配,找到子串就删除掉已经匹配到的子串,然后发现找不到可用的包,而且不切割分词的话查找很难做到,发现问题在于切割分词匹配,通过百度知道了正则表达式匹配能满足需求。
想法2.0:用正则表达式匹配,分别由关键字得到各级地址,比如由‘省’来匹配省份。但是又有新问题出现,有些地址缺省了关键字,比如‘福建福州’就缺了省和市导致无法定位。第一想法是正则匹配前预处理补全关键字,结合题目缺省关键字的只会是省或市,于是又想到省市地址表遍历对比,再判断若是缺省就补齐。
想法3.0:听同学说到可以用api,然后就去了解了一下高德地图的web服务api,阅读了开发手册,发现很好用!!!比想法2.0好写多了,于是就用了这个。

计算模块接口的设计与实现过程

设计实现过程

姓名和手机号码还是用正则匹配,然后剔除成纯地址信息,通过url上传地址信息,得到返回的一个包,再用包里的地理编码(坐标点)再URL上传,逆地理编码处理返回精准的地址。用这种方法优点是可以补齐某一级地址缺失;缺点是可能定位到邻近地址,所以最后两级地址还是用正则匹配比较精准。

关键代码

str3 = str2[0:pos[0]] + str2[pos[1]:] #剔除手机号码,得到仅包含地址信息的str3
url = "https://restapi.amap.com/v3/geocode/geo?key=6a6615350026e24aa1c159785e70a709" #使用高德API
urlweb = url + "&address=" + str3 #urlweb为完整API请求链接
webdata = requests.get(urlweb).text #webdata为网站返回数据包
content = json.loads(webdata) #转换为json格式
positon = content["geocodes"][0]["location"] #geocodes为地理编码信息列表,location为坐标点,两者用于逆地理编码
rurl = "https://restapi.amap.com/v3/geocode/regeo?output=JSON&key=6a6615350026e24aa1c159785e70a709&radius=100&extensions=base" #逆地理编码查询
rurlweb = rurl + "&location=" + positon #逆地理编码API
respond = requests.get(rurlweb).text #返回详细地理信息
respond = json.loads(respond) #格式转化

计算模块接口部分的性能改进

性能分析图

第一次个人编程作业_第1张图片

消耗最大的函数就是通过api的url调用

url = "https://restapi.amap.com/v3/geocode/geo?key=6a6615350026e24aa1c159785e70a709" #使用高德API
... 
rurl = "https://restapi.amap.com/v3/geocode/regeo?output=JSON&key=6a6615350026e24aa1c159785e70a709&radius=100&extensions=base" #逆地理编码查询

计算模块部分单元测试展示

编写单元测试,需要引入Python自带的unittest模块,编写mydict_test.py如下:

import unittest

from mydict import Dict

class TestDict(unittest.TestCase):

    def test_init(self):
        d = Dict(a=1, b='test')
        self.assertEqual(d.a, 1)
        self.assertEqual(d.b, 'test')
        self.assertTrue(isinstance(d, dict))

    def test_key(self):
        d = Dict()
        d['key'] = 'value'
        self.assertEqual(d.key, 'value')

    def test_attr(self):
        d = Dict()
        d.key = 'value'
        self.assertTrue('key' in d)
        self.assertEqual(d['key'], 'value')

    def test_keyerror(self):
        d = Dict()
        with self.assertRaises(KeyError):
            value = d['empty']

    def test_attrerror(self):
        d = Dict()
        with self.assertRaises(AttributeError):
            value = d.empty

计算模块部分异常处理说明

1.由于c/c++的编程习惯在使用python的if、while、for的后面老是忘记加“:”。
2.由于使用了null地址导致了程序崩溃,在使用值可能为null的对象时要先加判断,不为null次才能使用它的函数方法,不然会导致程序崩溃。

你可能感兴趣的:(第一次个人编程作业)