第一次编程作业
我的GitHub
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 30 | 30 |
Estimate | 估计这个任务需要多少时间 | 30 | 50 |
Development | 开发 | 800 | 870 |
Analysis | 需求分析 (包括学习新技术) | 100 | 60 |
Design Spec | 生成设计文档 | 60 | 50 |
Design Review | 设计复审 | 60 | 60 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 60 | 50 |
Design | 具体设计 | 200 | 250 |
Coding | 具体编码 | 100 | 150 |
Code Review | 代码复审 | 60 | 40 |
Test | 测试(自我测试,修改代码,提交修改) | 60 | 70 |
Reporting | 报告 | 65 | 70 |
Test Repor | 测试报告 | 20 | 30 |
Size Measurement | 计算工作量 | 30 | 20 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 15 | 20 |
合计 | 925 | 1120 |
解题步骤
- 先用正则表达式将姓名和号码提取出来。
- 打一个省市表
- 提取省市
- 提取剩下的地址
- 结果保存为json
设计实现过程
看到Java直接排除,因为没学过,而c++也是个半吊子,所以用python来编写这个程序,因为有学过python,实在是对我太友好了。
一开始想直接整个使用正则表达式,然后发现地址的标识会缺失,如果只用正则直接去世,所以我想到打表。
这个代码首先分别打一个省份和市的列表,先分别调用函数实现等级,姓名和电话的分离,剩下的函数主要是切出剩下的地址字段然后删除,最后留下的即为切到只剩下最后一级的地址。
最后各个函数和流程具体如下:
函数名 | 说明 |
---|---|
def createsheng | 省份打表 |
def createshi | 市打表 |
def cutname | 切去名字电话 |
def cutsheng | 切去省 |
def cutshi | 切去市 |
def cutall | 切去剩下的所有地址 |
![image.png](https://upload-images.jianshu.io/upload_images/19518479-4611ce519f67d61f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
返回示例
![image.png](https://upload-images.jianshu.io/upload_images/19518479-2288155ae68d2651.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
计算模块接口部分的性能改进
- 可见我总共用时15秒,builtins.exec花了我大部分的时间,说明我字符串表达式的返回太多次,降低字符串返回即可提高性能。
计算模块部分单元测试展示
- 打表的函数我就没有做单元测试了
def test_cutname(str):
a=cutname(str)
b=re.findall(r'\d!(.*)(\,).*(\d{11}).*',str)
self.assertEquals(a, b[0])
def test_findsheng(str):
a=findsheng(str)
b=re.findall(r'(.*)省?.*',str)
self.assertEquals(a, b[0])
def test_findshi(str):
a=findsheng(str)
b=re.findall(r'(.*)市?.)',str)
self.assertEquals(a, b[0])
计算模块部分异常处理说明
-
只有电话,没有地址
try:
words=string[0:2]#切片
except Error:
print('没有输入地址') -
注意贪婪匹配!
这个特别重要,有时候忘了写找了很久才知道错在哪里。