第一次个人编程作业
第一次个人编程作业
1.Github项目地址:https://github.com/mhqmhy/021700125
2.PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 30 | 30 |
Estimate | 估计这个任务需要多少时间 | 35 | 35 |
Development | 开发 | 900 | 1200 |
Analysis | 需求分析(包括学习新技术) | 240 | 240 |
Design Spec | 生成设计文档 | 20 | 20 |
Design Review | 设计复审 | 20 | 15 |
Coding Standard | 代码规范(为开发制定合适的规范) | 25 | 100 |
Design | 具体设计 | 120 | 200 |
Coding | 具体编码 | 360 | 405 |
Code Review | 代码复审 | 90 | 30 |
Test | 测试(自我测试,修改,提交修改) | 300 | 300 |
Reporting | 报告 | 60 | 35 |
Test Report | 测试报告 | 30 | 35 |
Size Measurement | 计算工作量 | 20 | 15 |
Postmortem & Process Improvement Plan | 事后总结并提出过程改进计划 | 60 | 30 |
合计 | 2310 | 2690 |
3.计算模块接口的设计与实现过程
3.1解题思路
题目的本质:字符串处理与匹配
1.针对第1级难度,删除感叹号和句号,利用正则表达式匹配11位数字,把11位电话单独取出保存,然后划分五级地址
2.剥去之后,剩下的就是地址了,匹配直辖市/省"、"直辖市/市"、"区/县/县级市"’、"街道/镇/乡"、"详细地址"五级,(自己手动打表,列了一个所有省,市,县(区)的列表),遍历搜索到表中存在的元素,
3.针对第2级难度,就在无极地址划分的基础上,在详细地址上划分七级,把详细地址划分成"路名"、"门牌号"、"详细地址"等
4.针对第3级难度,本来一开始没有什么思路,难道需要我把所有七级地址库的数剧全部爬下来么,尚且不问自己会不会爬虫,就想问能不能爬到,这是一个问题,爬到了怎么建立关系去索引匹配也是一个问题.
5.后来查找资料,以及询问隔壁班的大佬,知道了高德地图api这个东西。
6.简单介绍一下如何请求高德地图api爬取数剧:高德的Web服务api具有地理/逆地理编码功能,先将输入的地址编码成经纬度坐标,再用经纬度坐标逆编码出准确地址,把之前缺失的等级划分用调用api返回的相应等级地址补全;没想到竟然有这样神奇的东西,真的感叹科技的强大
3.2计算模块接口的实现
函数 | 功能 |
---|---|
find_5_address | 查找关键字匹对,五级地址划分 |
find_7_address | 在五级地址划分的基础上,对地址七级划分 |
get_formatted_address | 在find_7_address划分七级地址后查找出为空字符串的缺失地址,再使用它通过调用api获取地址详细地址json对象的返回值,实现补全的功能 |
- 程序流程图
3.3独到之处
- 可读性比较强,逻辑简单,只有一个py文件,没有其它json,数据库等等的依赖文件,方便大家阅读,也方便同学们评测
- 代码里只有3个函数,每一级难度对应一个函数,有上而下,基本做到了高内聚,低耦合
- 代码直接暴力打表,直接查询一、二、三、四级地址,直接索引,比较直观形象
4.计算模块接口部分的性能改进
4.1代码质量分析
本来是准备在Pycharm上下一个插件Pylint检查代码的质量,后来听大佬说codacy很好用,所以就尝试了一下。但是也很不容易,自己平时是一个编程习惯很不好的人,果然各种Warning,Refactor就来了,然后开始一系列的删空格,数空格,填空格,开始了一系列的驼峰命名法。以后的真的要注意代码格式和规范的问题,很不容易
4.2代码性能测试
-
从上面可以看出,程序大多数时间是花在了输入上
后来仔细分析了一下,为了去除等待输入的时间,这里直接赋初值,
-
于是发现时间不会集中在等待输入方面,但是依然get_formatted_address(address)函数请求url的时间比较多虽然直接调用高德地图api的效果很好,补全地址效果也不错,但是该方法还是存在一定瓶颈或者说隐患,即高德地图的个人开发者的地理正/逆编码服务每日调用量是有限制的。
-
如果说改进也是有可以改进的地方,可以预先通过高德api爬好数据,然后打造一个五级,七级地址庞大的数据库,然后通过索引一个一个地查询匹配,这样性能会更加均衡点。但爬虫,数据库啥地我还不怎么太会,所以这次怎么简单怎么来吧。
def get_formatted_address(address):
#根据百度地图api接口获取正地址编码也就是经纬度
url1='https://restapi.amap.com/v3/geocode/geo? address='+address+'&output=JSON&key=a22337e1181873a
96bc9701887d1c349'
#获取经纬度
resp1=requests.get(url1)
#resp1_str=resp1.text
#resp1_str=resp1_str.replace('showLocation&&showLocation','')
#resp1_str=resp1_str[1:-1]
resp1_json=resp1.json()
location=resp1_json['geocodes'][0]['location']
#根据经纬度获取结构化地址
#lng=location.get('lng')
#lat=location.get('lat')
url2='https://restapi.amap.com/v3/geocode/regeo?output=JSON&location='+location+'&key=a22337e1181873a96bc9701887d1c349&radius=5&extensions=all'
resp2=requests.get(url2)
resp2_json=resp2.json()
#提取结构化地址
formattted_address=resp2_json['regeocode']['addressComponent']
return formattted_address
5.计算模块部分单元测试展示
选取10个测试用例,1级难度,2级难度,3级难度均衡分布。
1!鲁胞,上海长宁区周18951233466家桥街道长宁路999号春天花园.
1!臧街经,北京市东城区北新桥街道东直门内大街民15679601503安小区8号楼.
1!双韵,安徽黄山市歙县雄村镇006县道与G56杭瑞高速歙县雄村乡防保站13575634949.
2!澹台拄云,浙江省杭州市丁兰街道环丁路10号明珠15244068259.
2!蒯刑浦,吉林省白城市洮南市团结街道兴安南街5566号安泰社区公共事务13949401891服务中心.
2!汲痰廊,13585841307浙江舟山市普陀区六横镇台兴路202号台门中学.
2!皇甫宁,浙江省温州市文成县南田镇朱宅路20号南田15217337889镇人民政府.
3!艾堤,北京市海淀区阜成15938433933路八宝庄小区8号楼.
3!柯彰,浙江省西湖区蒋村街道晴川街2号蒋村13675029411花园83幢.
END
最后的代码覆盖率有点低,可能是自己太懒了,没有想太多的测试用例
6.计算模块部分异常处理说明
- 没输入题目等级,应直接中断程序并提示“没有等级,请输入题目等级号”
!韩梅梅,广东省珠海金湾区三灶1234567镇乐康街一巷11号三灶镇海澄村委会.
- 手机号位数出错,提示“没有手机号码,请确认手机号码”
1!韩梅梅,广东省珠海金湾区三灶1234567镇乐康街一巷11号三灶镇海澄村委会.
- 姓名后缺少逗号,处理完姓名应返回空串并提示“没有逗号,请检查输入的姓名后是否缺少逗号”
1!韩梅梅广东省珠海金湾区三灶1234567镇乐康街一巷11号三灶镇海澄村委会.
- 没有输入姓名,应直接中断程序并提示“没有姓名,检查输入的姓名是否错误”
1!,广东省珠海金湾区三灶1234567镇乐康街一巷11号三灶镇海澄村委会.
grade,all = sub_grade(all)
name,all = sub_name(all)
tel,all= sub_tel(all)
address = sub_address(all)
except ValueError:
print("ValueError !")
except KeyError:
print("KeyError !")
except IndexError:
print("IndexError !")
except Exception:
print("OtherError !")
else:
province,city,district,town,street =find_5_address(address)
##7.项目感悟
这次损失的地址薄也算是自己的第一次项目,从什么都不会到开始询问大佬,查找作业,同学间相互讨论,也算是一次难忘的学习体验。python语言还是蛮强大的,爬取高德地图API的数剧,然后补全,我觉得这个是项目的核心,也是自己需要学习的最关键地方。接下来软工的日子加油!