第一次个人编程作业

1.github地址:https://github.com/cheslee15/031702245

psp表格

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

解题思路

实现基本功能:

将不规范的乱序的地址簿做规范化处理,注意点:
1.直辖市与一般城市的匹配区别,如样例中的小美。
2.手机号码一定不会和地址中的数字相邻,即不会出现福州市西二环路11380502116922号或者福州大学30#31395521336233这样的情况。
3.地址最终格式应为["直辖市/省","直辖市/市","区/县/县级市","街道/镇/乡","详细地址"]

具体实现:

  • 首先,根据输入的数据,利用“.”将输入的数据切分为若干个数组
  • 在每个数组中,利用正则匹配,首先将姓名和电话找出
  • 在每次匹配过后,利用replace函数将之前匹配的内容从该数组擦除,然后再对后面的内容进行匹配,并且要注意输出格式
    正则匹配参考:https://www.runoob.com/regexp/regexp-syntax.html

实现的主要函数:

函数名 功能
x.split( ) 根据关键字将文本切分为数组
x.replace() 擦出数组中的指定内容
x.findall() 正则匹配指定内容

部分代码:

province= re.findall(r",(.*?)省", name)
        if province:
            print("地址:",end="")
            print(province[0], end="")
            print("省",end="")
            print(",", end="")
            name = name.replace(province[0],"")
            name = name.replace("省", "")
            city = re.findall(r",(.*?)市", name)
            print(city[0], end="")
            print("市", end="")
            print(",", end="")
            name=name.replace(city[0],"")

            name = name.replace("市", "")

性能分析:

cprofile——python性能分析工具:https://www.cnblogs.com/kaituorensheng/p/4453953.html

性能测试结果如下:
_ncalls          tottime            percall      cumtime         percall        filename:lineno(function)
        1              0.000s         0.000s     11.314s         11.314s          firtst.py:1()
        1              0.000s         0.000s     11.314s         11.314s          firtst.py:2(xxx)
        1              0.000s         0.000s     11.314s         11.314s          {built-in method builtins.exec}
        1            11.314s        11.314s     11.314s        11.314s          {built-in method builtins.input}
        1              0.000s         0.000s      0.000s          0.000 s          {method 'disable' of '_lsprof.Profiler' objects}
        1              0.000s         0.000s      0.000s          0.000 s           {method 'split' of 'str' objects}_
  • 对函数进行分析,显然自己代码的瓶颈是在于无脑。这样虽然可以比较方便,或者说比较偷懒,但是的的确确给自己的程序性能带来了很大的影响。
  • 对于菜鸟来说,无脑不失为解决问题的好方法。可是没办法解决一些特殊情况。
  • 解决办法:找到可行的app或者网页,利用python向http发包,找一个合适的接口,接收到的数据已经对地址进行了分类,这样可以更精准的定位。

单元测试:

测试数据输入:
李四,福建省福州13756899511市鼓楼区鼓西街道湖滨路110号湖滨大厦一层.
小美,北京市东15822153326城区交道口东大街1号北京市东城区人民法院.
小陈,广东省东莞市凤岗13965231525镇凤平路13号.
控制台输出:
姓名:李四,手机:13756899511,地址:福建省,福州市,鼓楼区,鼓西街道,湖滨路110号湖滨大厦一层
姓名:小美,手机:15822153326,地址:北京,北京市,东城区,  ,交道口东大街1号人民法院
姓名:小陈,手机:13965231525,地址:广东省,东莞市, ,凤岗镇,凤平路13号

异常样例:

当测试数据不是从”省“开始时,程序会报错,需要先匹配到下一级地址,再返回上一级地址
province= re.findall(r",(.*?)省", name)
        if province:

        ........
        else:
           city= re.findall(r",(.*?)市",name)
           print("地址:",end="")
           print(city[0], end="")
           print(",", end="")
           print(city[0],end="")
           print("市", end="")
           print(",", end="")
           name = name.replace(city[0], "")
           name = name.replace("市", "")
        classify= re.findall(r",(.*?)区", name)

总结与思考:

  • 关于github:之前只是皮毛的建了个基于hexo的个人主页。并没有很好的理解Github的作用。直到在写完基本功能后,尝试去学习了下Github的入门教程,仿佛发现了一片新天地。每次修改完一次的功能,就commit一下。然后可以看到自己的成长的过程,这种感觉很棒。但是自己目前仍然对github的一些命令不大熟悉,导致自己曾经有一次把库搞炸了,重头foke了一下。同时,在使用的过程中,阅读了畅畅酱博客以及构建之法的相关知识。知道了注释以及这些信息的提交尽量不要使用中文,所以在这个过程中逐渐养成了这个习惯。自己的英语功底不好,有时候还要借助谷歌翻译,但是这也是一个进步。而缺点在于,还是没有能够清晰的给出commit信息。这个需要慢慢培养一下自己。
  • 性能测试:性能测试前,知道自己写的代码有点渣,也清楚在那些部分肯定是泛红的一片。导致这中原因,主要在于自己没有能够好好的分析需求,追求时间,仓促编码,而省下来的这部分时间却在编码的过程中翻倍付出。软工实践不是那种走一步看一步的事情。如果没有能够以一个相对大局的观念,统筹规划一下,组织好代码结构,写好对应的流程图,会对之后的编码以及代码的性能,可扩展性有很大的帮助的。

一边丧,一边努力寻找阳光~~~

你可能感兴趣的:(第一次个人编程作业)