第一次个人编程作业
一、仓库地址
二、psp表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 60 | 60 |
· Estimate | · 估计这个任务需要多少时间 | 60 | 60 |
Development | 开发 | 1000 | 1360 |
· Analysis | · 需求分析 (包括学习新技术) | 200 | 360 |
· Design Spec | · 生成设计文档 | 120 | 100 |
· Design Review | · 设计复审 | 60 | 80 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 20 | 10 |
· Design | · 具体设计 | 120 | 150 |
· Coding | 具体编码 | 240 | 300 |
· Code Review | · 代码复审 | 100 | 120 |
· Test | · 测试(自我测试,修改代码,提交修改) | 100 | 240 |
Reporting | 报告 | 150 | 180 |
· Test Repor | · 测试报告 | 60 | 60 |
· Size Measurement | · 计算工作量 | 30 | 40 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 60 | 80 |
· 合计 | 1210 | 1600 |
三、计算模块接口的设计与实现过程。
要实现这个代码,由三个部分:
1.从输入的字符串str中提取出姓名信息:
def getphone(str):
phone = re.search('\d{11}', str)
return phone.group()
2.从输入的字符串str中提取出手机号码信息:
def getname(str):
name = re.search('[^,]+', str[2:])
return name.group()
3从输入的字符串str中提取出地址信息并分级(由于源代码较长,仅展示部分代码。):
def getaddr(str):
Match1 = re.search('[^,]+$', str)
str_step1 = Match1.group()
str_step2 = re.sub('\d{11}|', '', str_step1)
Match2 = re.sub('\.', '', str_step2)
if Match2[0:2]=='吉林':
Match2=Match2[2:]
if Match2[0]=='省':
Match2=Match2[1:]
str_step3 = cpca.transform([Match2], cut=False, open_warning=False) # 调用cpca模块分出地址簿前三级
list1 = str_step3.values.tolist()
if (list1[0][0][0:2] == Match2[0:2]):
list2 = list1[0]
else:
str_step3 = cpca.transform([Match2], open_warning=False) # 调用cpca模块分出地址簿前三级
list1 = str_step3.values.tolist()
list2 = list1[0]
str_step4 = list2[-1]
str_step5 = re.search(re.compile(r'街道+|镇+|乡+|苏木+|开发区|合作区|管委会|园区'), str_step4) # 分离出第四级
if str_step5 == None:
list4 = ['']
list5 = [str_step4]
else:
x = str_step5.span()
list4 = [str_step4[0:x[1]]] # 把关键词之前的地址分成第四级给list4
list5 = [str_step4[x[1]:]]
if list4[0][-1]!='镇':
if list5[0][0]=='道':
list5=[str_step4]
list4=['']
……
del list2[-1]
list2 = list2 + list4
list2 = list2 + list5
return list2
到这边,地址的前五级算是分完了。在难度2的后续分级中,我同样采用匹配关键字分级。到最后,将三个得出的数据赋给一个字典,再按题目要求转为json格式输出:
dict = {'姓名': name, '手机': phone, '地址': addr}
json_dict = json.dumps(dict, ensure_ascii=False)
print(json_dict)
其实getaddr函数还能够细分,这个函数其实相当于一个大杂烩,将求得地址所需的步骤全都包含在了函数中。如果说改进的话,还可以将函数功能具体细分,而不是这样都放在一个函数里。
四、计算模块接口部分的性能改进。
问题分析:
1.调用cpca会出现本来没有的地址被补全的情况
2.四个直辖市的输出不符合要求
改进代码:
if list2[1][0:2] not in str_step2:
list2[1]=''
if list2[2][0:3] not in str_step2:
list2[2] = ''
if list2[0][0:2] == '上海':
list2[0] = list2[0][0:2]
list2[1]='上海市'
if list2[0][0:2] == '天津':
list2[0] = list2[0][0:2]
list2[1] = '天津市'
if list2[0][0:2] == '重庆':
list2[0] = list2[0][0:2]
list2[1] = '重庆市'
if list2[0][0:2] == '北京' :
list2[0] = list2[0][0:2]
list2[1] = '北京市'
用多个if语句来修改地址列表
函数调用图
时间开销图
程序中耗时最多得是input。
五、单元测试
1!皇甫享,安徽宣城郎13734164891溪县飞鲤镇011乡道西三立村村委会.
1!家按犯,西藏自治区昌都卡若区城关镇214国道城关镇嘎东街社区居民委员15347650776会.
1!席赠,湖南省长沙市雨花区黎托街道黎托15224968346乡川河村雨花区托溪小学.
1!淳于象,辽宁丹东凤城市刘家河镇304国道徐家台村委13986910893会.
1!成偶,山西省吕梁岚18918500295县王狮乡209国道阳湾明德小学.
1!何东,北京东城13297814858区朝阳门街道南小街59号竹杆胡同小区.
1!满哪俊,福建福州仓山区临江街道工农路36号下池小区11号15384414182楼.
1!钱僻苍,安徽省合肥市瑶海区合肥龙岗综合经济开发区海洲景秀世家2期13001981786.
1!阳吟,上海市绿华18970386517镇华西村村委会.
1!施裕槐,上海普陀区大13743250056渡河路1927弄真北新村三街坊2号楼.
{"姓名": "皇甫享", "手机": "13734164891", "地址": ["安徽省", "宣城市", "郎溪县", "飞鲤镇", "011乡道西三立村村委会"]}
{"姓名": "家按犯", "手机": "15347650776", "地址": ["西藏自治区", "昌都市", "卡若区", "城关镇", "214国道城关镇嘎东街社区居民委员会"]},
{"姓名": "席赠", "手机": "15224968346", "地址": ["湖南省", "长沙市", "雨花区", "黎托街道", "黎托乡川河村雨花区托溪小学"]},
{"姓名": "淳于象", "手机": "13986910893", "地址": ["辽宁省", "丹东市", "凤城市", "刘家河镇", "304国道徐家台村委会"]},
{"姓名": "成偶", "手机": "18918500295", "地址": ["山西省", "吕梁市", "岚县", "王狮乡", "209国道阳湾明德小学"]}
{"姓名": "何东", "手机": "13297814858", "地址": ["北京", "北京市", "东城区", "朝阳门街道", "南小街59号竹杆胡同小区"]}
{"姓名": "满哪俊", "手机": "15384414182", "地址": ["福建省", "福州市", "仓山区", "临江街道", "工农路36号下池小区11号楼"]}
{"姓名": "钱僻苍", "手机": "13001981786", "地址": ["安徽省", "合肥市", "瑶海区", "合肥龙岗综合经济开发区", "海洲景秀世家2期"]}
{"姓名": "阳吟", "手机": "18970386517", "地址": ["上海", "上海市", "", "绿华镇", "华西村村委会"]}
{"姓名": "施裕槐", "手机": "13743250056", "地址": ["上海", "上海市", "普陀区", "", "大渡河路1927弄真北新村三街坊2号楼"]}
六
完整表格见顶部
时间花费见第四点。
七、总结
1.这个程序还是有很多无法解决的问题
2.我的思维还是局限在面向过程
3.我真的还只是一个小菜鸟,道阻且长啊。