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) #格式转化
计算模块接口部分的性能改进
性能分析图
消耗最大的函数就是通过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次才能使用它的函数方法,不然会导致程序崩溃。