在撸码过程中,总有很多代码需要重构,码一个问候用户的小例子,加深对代码重构的印象。

原始代码:

 1 import json
2
3 filename = 'username.json' #定义文件名
4
5 try:
6 with open(filename) as file_object:
7 username = json.load(file_object) #加载存储的用户名,如果有的话
8
9 except FileNotFoundError:
10 username = input("what is your name: ")
11 with open(filename,'w') as file_object: #以写入的方式打开文件filename
12 json.dump(username,file_object) #将username写入到文件对象中
13 print("We will remember you when you back " +username + "!") #打印问候语
14
15 else:
16 print("Welcome back, " + username + "!") #打印问候语

代码重构1,将代码全部封装到一个函数里面:

 1 import json
2
3 '''定义函数,用于代码封装'''
4 def greet_user():
5 filename = 'username.json'
6 try:
7 with open(filename) as file_object:
8 username = json.load(file_object)
9
10 except FileNotFoundError:
11 username = input("What is your name: ")
12 with open(filename,'w') as file_object:
13 json.dump(username,file_object)
14 print("We will remember you when you back, " + username + "!")
15
16 else:
17 print("Welcome back, " + username + "!")
18
19 greet_user() #调用函数问候

代码重构2,将代码重构1的函数进一步拆分,让函数greet_user()不执行那么多任务,我们将获取存储的用户名的代码写到另一个get_stored_user()函数中。

 1 import json
2
3
4 def get_stored_user():
5 filename = 'username.json'
6 try:
7 with open(filename) as file_object:
8 username = json.load(file_object)
9
10 except FileNotFoundError:
11 return None
12
13 else:
14 return username
15
16
17 def greet_user():
18 username = get_stored_user()
19 if username:
20 print("Welcome back " + username + "!")
21 else:
22 username = input("What is your name: ")
23 filename = 'username.json'
24 with open(filename,'w') as file_object:
25 json.dump(username,file_object)
26 print("We will remember you when you back, " + username + "!")
27
28 greet_user() #调用函数问候

代码重构3,由于最终的目的是问候用户,我们可以将重构2里的代码进一步拆分,将没有用户名的时候提示输入用户名的代码存储在另外一个函数中。

 1 import json
2
3 def get_stored_user():
4 '''定义函数以获取存储了的用户名'''
5 filename = 'username.json'
6 try:
7 with open(filename) as file_object:
8 username = json.load(file_object)
9 except FileNotFoundError:
10 return None
11 else:
12 return username #返回用户名
13
14 def get_new_user():
15 '''定义函数以获取用户输入'''
16 username = input("What is your name: ")
17 filename = 'username.json'
18 with open(filename,'w') as file_object:
19 json.dump(username,file_object)
20
21 return username #返回用户名
22
23 def greet_user():
24 '''定义函数问候用户'''
25 username = get_stored_user()
26 if username:
27 print("Welcome back, " + username + "!")
28 else:
29 username = get_new_user()
30 print("We will remember you when you back, " + username + "!")
31
32 greet_user() #调用函数,打印问候语

代码重构的意义在于,简化同一个代码块的任务量,让代码更容易读懂。

python之代码重构的更多相关文章

  1. 让代码重构渐行渐远系列(3)——string.Equals取代直接比较与非比较

    重构背景及原因 最近由于项目组的人员在不断扩充,导致项目中代码风格各异,大有百花齐放甚至怒放之势.考虑到团队的生存与发展,经过众人多次舌战之后,最终决定项目组根据业务分成几个小分队,以加强团队管理与提 ...

  2. C++代码重构——从C global到C++ template

    在学数据结构的时候,我常有这样目标--写出能够最大程度复用的代码(算法正确,封装优秀).我常想--如何能在短时间内达成"算法正确,封装优秀"这样的目标.经过一段时间的摸索,我的结论 ...

  3. ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(十二) 代码重构使用反射工厂解耦(一)缓存切换

    前言 上一篇中,我们用了反射工厂来解除BLL和UI层耦合的问题.当然那是最简单的解决方法,再复杂一点的程序可能思路相同,但是在编程细节中需要考虑的就更多了,比如今天我在重构过程中遇到的问题.也是接下来 ...

  4. CSS代码重构与优化之路

    作者:@狼狼的蓝胖子 网址:http://www.cnblogs.com/lrzw32/p/5100745.html 写CSS的同学们往往会体会到,随着项目规模的增加,项目中的CSS代码也会越来越多, ...

  5. NET代码重构

    记一次.NET代码重构   好久没写代码了,终于好不容易接到了开发任务,一看时间还挺充足的,我就慢慢整吧,若是遇上赶进度,基本上直接是功能优先,完全不考虑设计.你可以认为我完全没有追求,当身后有鞭子使 ...

  6. 代码重构 & 常用设计模式

    代码重构 重构目的 相同的代码最好只出现一次 主次方法 主方法 只包含实现完整逻辑的子方法 思维清楚,便于阅读 次方法 实现具体逻辑功能 测试通过后,后续几乎不用维护 重构的步骤 1  新建一个方法 ...

  7. Python一行代码

    1:Python一行代码画出爱心 print]+(y*-)**-(x**(y*<= ,)]),-,-)]) 2:终端路径切换到某文件夹下,键入: python -m SimpleHTTPServ ...

  8. ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(十一) 代码重构使用反射工厂解耦

    前言 自从此博客发表以及代码开源以来,得到了许多人的关注.也没许多吧,反正在我意料之外的.包括几位大牛帮我做订阅号推广,真的很感谢他们.另外,还有几个高手给我提了一些架构上的问题.其实本身这个项目是没 ...

  9. python爬虫代码

    原创python爬虫代码 主要用到urllib2.BeautifulSoup模块 #encoding=utf-8 import re import requests import urllib2 im ...

随机推荐

  1. JVM垃圾回收器、内存分配与回收策略

    新生代垃圾收集器 1. Serial收集器 serial收集器即串行收集器,是一个单线程收集器. 串行收集器在进行垃圾回收时只使用一个CPU或一条收集线程去完成垃圾回收工作,并且会暂停其他的工作线程( ...

  2. linux命令 ——netstat

    作用: 能查到与客户端链接状态和数量 netstat各选项参数说明: -a : 列出所有连接,服务监听,Socket信息 -c : 持续列出网络状态 #每隔一秒输出网络信息 -t : 显示TCP端口  ...

  3. LeetCode 030 Substring with Concatenation of All Words

    题目要求:Substring with Concatenation of All Words You are given a string, S, and a list of words, L, th ...

  4. KNN 算法-实战篇-如何识别手写数字

    公号:码农充电站pro 主页:https://codeshellme.github.io 上篇文章介绍了KNN 算法的原理,今天来介绍如何使用KNN 算法识别手写数字? 1,手写数字数据集 手写数字数 ...

  5. Java 基础之 String 类

    String String 被声明为 final,因此不能被继承.(Integer 等包装类也不能被继承) 在 java8 中,String 内部使用 char 数组 来存储数据 public fin ...

  6. 关于Django的序列化问题。serializers

    在DRF框架里,ModelSerializers是一个重要的组件.大大的帮组我们节省了数据序列化的过程,真的可以说是良心产品.接手的这个项目用的Django,前人的代码都是手动序列化的,为了保证风格的 ...

  7. 将Shiny APP搭建为独立的桌面可执行程序 - Deploying R shiny app as a standalone application

    目录 起源! 目的? 怎么做? 0 准备工作 1 下载安装R-portable 2 配置 Rstudio 3 搭建Shiny App 3.1 添加模块 3.2 写AppUI和AppServer 3.3 ...

  8. Python使用import导入模块时执行了模块的文件但报ModuleNotFoundError错误的愚蠢问题

    老猿在学习import导入自定义模块时,搜索路径中sys.path中已经添加对应路径,发现会报ModuleNotFoundError,但对应的模块代码被执行了,代码myfib.py如下: def fi ...

  9. 极光实验室 第一次考核wp

    第一道题: 上来就让我买flag,用御剑扫目录,发现了这道题有源码index.php.bak!直接下载. <meta charset='UTF-8'> <title>极光实验室 ...

  10. 支持“EFDBContext”上下文的模型已在数据库创建后发生更改。请考虑使用 Code First 迁移更新数据库

    在修改数据库表后会出现 支持"EFDBContext"上下文的模型已在数据库创建后发生更改.请考虑使用 Code First 迁移更新数据库 这个问题解决方法: 在Global.a ...