GitHub链接
https://github.com/panther0416/041702215
PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
· Planning | · 计划 | 60 | 30 |
· Estimate | · 估计这个任务需要多少时间 | 30 | 20 |
· Development | · 开发 | 300 | 240 |
· Analysis | · 需求分析 (包括学习新技术) | 300 | 300 |
· Design Spec | · 生成设计文档 | 60 | 30 |
· Design Review | · 设计复审 | 30 | 20 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 30 | 25 |
· Design | · 具体设计 | 60 | 60 |
· Coding | · 具体编码 | 300 | 360 |
· Code Review | · 代码复审 | 30 | 60 |
· Test | · 测试(自我测试,修改代码,提交修改) | 60 | 50 |
· Reporting | · 报告 | 60 | 65 |
· Test Repor | · 测试报告 | 60 | 30 |
· Size Measurement | · 计算工作量 | 10 | 10 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 30 | 30 |
· 合计 | 1390 | 1300 |
计算机模块接口的设计与实现过程
- 总体上利用面向对象分析与设计的方法,创建类、封装属性和函数;输入一行字符串进行初始化后,调用内部函数输出一个字典(包含关键字“姓名”、“手机”、“地址”,及其对应的键值);
- 利用字符串函数split()分离出难度等级保存在属性level中;
- 利用正则匹配相关知识提取出姓名和手机号码,其中调用了re模块中的search()函数;
- 接下来是最重要的解析地址:
- 1、利用cpca库自动将地址的前三级行政区提取出来,调用transform()函数(这个函数的输入格式要用列表,如果直接输入字符串的话会把字符串分为一个一个字符去识别,这样就识别失败了,所以必须要列表才能映射,输出为DataFrame格式)和dict()函数将数据类型从str->list->DataFrame->Dict,提取”省市区“对应的值;
- 2、通过关键字查询,调用split()函数提取出第四级行政区域,包括“街道”、“镇”、“乡”、“苏木”、“开发区”、“合作区”等;
- 3、判断level的值,若level=1则将剩下的字符串作为第五级地址;若level=2或3,则再次进行下一步解析;
- 4、通过关键字查询,调用split()函数提取出第五级行政区域,包括“路”、“村”、“道”、“街”、“巷”、“小区”等;
- 5、通过关键字查询,调用split()函数提取出第六级行政区域,包括“号楼“和”号“;
- 6,将剩下的字符串作为最后一级地址;
- 注意:每次提取所需信息后:
- 调用append()函数将各级地址存到字符串列表address中;
- 调用replace()将之在字符串中删去,便于后续匹配、提取;
- 若该级地址未提取到信息,也应将空字符“”加入地址列表中;
- 然后,将“姓名”、“手机”、“地址”作为键,对应的值存入字典dict中,其中“地址”的值为字符串数组;
- 最后,调用json库中dumps()函数将字典转化为json输出格式。
- 这其中的关键一定是正则表达式和python的字符串处理和分割。
计算机模块接口部分的性能改进
- 使用了pycharm专业版的profile功能生成了一张性能分析图(如下),果不其然find_address()是程序中消耗最大的函数;
- 避免重复调用某个相同输入和功能的函数,新建一个变量进行存储函数返回值,牺牲较小的存储空间以优化运行时间及效率;
- 在已掌握的处理字符串的方法中,进行比对、尝试,选择出更加有效的方法,从而进行优化,如:
- 提取信息:1、name=re.match("(?P ^[\u4e00-\u9fa5]*)",str).groupdict(),phone=re.search("(?P \d{11})",str).groupdict();
2、if char[n] in str. - 除去信息:1、str.split() 分割后再合并;2、str.replace(replace_str,"");3、str.strip()函数只处理字符串首尾;4、re.sub(pattern,replace_str,str)。
- 提取信息:1、name=re.match("(?P ^[\u4e00-\u9fa5]*)",str).groupdict(),phone=re.search("(?P \d{11})",str).groupdict();
计算模块部分异常处理说明
- 输入:1!邓茅戴,甘肃省兰州市七里河区西果园镇晏家坪19号兰15294929449州汽车南站.
输出:{"姓名": "邓茅戴", "手机": "15294929449", "地址": ["甘肃省", "兰州市", "七里河区", "西果园镇", "晏家坪19号兰州汽车南站"]}
- 输入:1!惠页,广西壮族自治区柳州市河13205607755东街道东环大道286号山水福第小区兴佳山水福第.
输出:{"姓名": "惠页", "手机": "13205607755", "地址": ["广西壮族自治区", "柳州市", "", "河东街道", "东环大道286号山水福第小区兴佳山水福第"]}
- 输入:2!卞敛,辽宁大连市中山区桃源13474708069街道桃仙街43-3号洪顺社区居委会.
输出:{"姓名": "卞敛", "手机": "13474708069", "地址": ["辽宁省", "大连市", "中山区", "桃源街道", "桃仙街", "43-3号", "洪顺社区居委会"]}
- 输入:2!龚楼赫,天津市西于15915069113庄街道临水道7号红桥区西于庄街道子牙里第一居民区社区工作办公室.
输出:{"姓名": "龚楼赫", "手机": "15915069113", "地址": ["天津", "天津市", "红桥区", "西于庄街道", "临水道", "7号", "红桥区子牙里第一居民区社区工作办公室"]}
- 输入:3!蒯刑浦,白城市洮南市团结街道兴安南街5566号安泰社区公13949401891共事务服务中心.
输出{"姓名": "蒯刑浦", "手机": "13949401891", "地址": ["吉林省", "白城市", "洮南市", "团结街道", "兴安南街", "5566号", "安泰社区公共事务服务中心"]}
- 输入:3!何振,黑龙江省大庆龙15691073609凤街道凤阳路283号炼厂居委会.
输出:{"姓名": "何振", "手机": "15691073609", "地址": ["黑龙江省", "大庆市", "", "龙凤街道", "凤阳路", "283号", "炼厂居委会"]}
个人总结
- 一开始看到柯逍老师班级的同学因为编程作业而苦不堪言,自己却悠哉地健身、休息,
还是蛮开心的。当时都戏谑地说我们班这是暴风雨前的宁静,然而......没想到我们班居然也要做这些难上加难的作业,我开始自闭、难受。后悔、十分后悔、非常后悔的就是暑假没有好好练习python编程和面向对象分析与设计知识,仅仅只学习了一点理论知识,到了编程时压根就不够用。通过这学期的各学科代码作业,一定要将理论和实践相结合,好好地学习编程,提高自己的能力。 - 其次就是回答第一次博客的问题,“凌晨四点还在打代码是什么感受?”,答案是:我太累了我太难了我太菜了。
- 学到就是赚到!通过软件工程实践,收获其实还是蛮大的,如果不是这次作业我也不会逼自己学习到那么多知识,也不会获得脑力和能力的提升。