第一次个人编程作业

GitHub链接

https://github.com/panther0416/041702215

PSP表格

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

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

  • 总体上利用面向对象分析与设计的方法,创建类、封装属性和函数;输入一行字符串进行初始化后,调用内部函数输出一个字典(包含关键字“姓名”、“手机”、“地址”,及其对应的键值);
  • 利用字符串函数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<姓名>[1]*)",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!邓茅戴,甘肃省兰州市七里河区西果园镇晏家坪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号", "炼厂居委会"]}
  • 测评结果:

  • 一级难度的地址都可以通过,二级地址可以通过80%,三级地址...估计只能通过30%,因为我对补全地址信息这块做得不是很好。

个人总结

  • 一开始看到柯逍老师班级的同学因为编程作业而苦不堪言,自己却悠哉地健身、休息,还是蛮开心的。当时都戏谑地说我们班这是暴风雨前的宁静,然而......没想到我们班居然也要做这些难上加难的作业,我开始自闭、难受。后悔、十分后悔、非常后悔的就是暑假没有好好练习python编程和面向对象分析与设计知识,仅仅只学习了一点理论知识,到了编程时压根就不够用。通过这学期的各学科代码作业,一定要将理论和实践相结合,好好地学习编程,提高自己的能力。
  • 其次就是回答第一次博客的问题,“凌晨四点还在打代码是什么感受?”,答案是:我太累了我太难了我太菜了
  • 学到就是赚到!通过软件工程实践,收获其实还是蛮大的,如果不是这次作业我也不会逼自己学习到那么多知识,也不会获得脑力和能力的提升。

  1. \u4e00-\u9fa5 ↩︎

posted @ 2019-09-29 22:41  _Panther  阅读(183)  评论(4编辑  收藏  举报