重构Python代码的六个实例


Posted in Python onNovember 25, 2020

前言

对自己写的冗长代码,想重构但又无思路?小编整理了介绍python代码重构优化的一些方法,助你一臂之力。

编写干净的 Pythonic 代码就是尽可能使其易于理解,但又简洁。所以重构代码让代码简洁易理解是很有必要的。

本文重点是想跟大家探讨为什么这些重构是好想法,而不仅仅是如何做。

1. 合并嵌套的 if 条件

太多的嵌套会使代码难以理解,这在 Python 中尤为如此,因为 Python 没有括号来帮助区隔不同的嵌套级别。

阅读深度嵌套的代码容易让人烦躁,因为你必须理清哪些条件属于哪一级。因此,我们应尽可能减少嵌套,如果两个条件可以用 and 合在一起,会比嵌套更易读。

合并之前:

if a:
 if b:
  return c

合并后:

if a and b:
 return c

2. 将重复的代码移到条件语句之外

我们应该始终寻找移除重复代码的方法。这是提升代码能力的好办法。

有时,在条件的两个分支上出现重复代码,这意味这段代码将始终执行。因此这段重复的代码可以从条件中移出,放在条件之外执行。

if sold > DISCOUNT_AMOUNT:
 total = sold * DISCOUNT_PRICE
 label = f'Total: {total}'
else:
 total = sold * PRICE
 label = f'Total: {total}'

通过将对label变量赋值移到到条件之外,我们删除了重复的代码行,并明确了条件实际控制的内容,就是计算total。

if sold > DISCOUNT_AMOUNT:
  total = sold * DISCOUNT_PRICE
else:
  total = sold * PRICE
label = f'Total: {total}'

3. 将内部循环中的yield替换为yield from

经常忽略的一个小窍门是 Python 的yield关键字有对应的为collections准备的yield from。因此无需使用 for 循环遍历集合。这使代码变短,并删除 for 中的额外变量。而且消除 for 循环后,yield from使程序运行效率提高约 15%。

重构前:

def get_content(entry):
  for block in entry.get_blocks():
    yield block

重构后:

def get_content(entry):
  yield from entry.get_blocks()

4. 使用 any() 而不是用于循环

常见的模式是,我们需要查找是否集合中的一个或多个项符合某些条件。这可以通过 for 循环完成,例如:

found = False
for thing in things:
  if thing == other_thing:
    found = True
    break

更简洁的方法,是使用 Python 的 any() 和 all()内置函数,来清楚地显示代码的意图。

found = any(thing == other_thing for thing in things)

当至少有一个元素计算为 True 时,all() 将返回 True,只有当所有元素都计算为 True 时,all() 将返回 True。

如果对 any() 的调用找到一个值值为 True 的元素,它可以立即返回。

5. 用[]替换list()

创建列表的最简洁和 Pythonic 的方法是使用 []。

x = []
x = ['first', 'second']

这样做有额外的优点:是一个很好的改进程序性能的方法。

以下是更改之前和之后的时间对比:

$ python3 -m timeit "x = list()"
5000000 loops, best of 5: 63.3 nsec per loop
$ python3 -m timeit "x = []"
20000000 loops, best of 5: 15.8 nsec per loop

同样的原因和性能表现,使用{}替代dict()。

6. 将重复执行的语句移出for/while循环

将“不变的”语句从循环中移出。如果某条语句只是设置了一些变量供循环使用,则不需要在循环中。循环本身就是复杂的,因此在编写循环时,应牢记,使其更短、更容易理解。

在此示例中,city变量在循环中赋值,但它只读取且不更改。

for building in buildings:
  city = 'London'
  addresses.append(building.street_address, city)

因此,将其移出是安全的,这更清楚地说明,相同的city值将应用于每个building变量。

city = 'London'
for building in buildings:
  addresses.append(building.street_address, city)

这也是提高了程序性能 ,因为如果循环中的任何语句将在每次循环运行时执行。在这些多次执行上花费的时间属于浪费,因为它只需要执行一次。如果语句涉及对数据库的调用或其他耗时的任务,则这种节省可能非常重要。

参考链接:

https://sourcery.ai/blog/explaining-refactorings-1/

总结

到此这篇关于重构Python代码的文章就介绍到这了,更多相关重构Python代码内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python基础教程之循环介绍
Aug 29 Python
复习Python中的字符串知识点
Apr 14 Python
详解在Python的Django框架中创建模板库的方法
Jul 20 Python
python+django快速实现文件上传
Oct 24 Python
python自动登录12306并自动点击验证码完成登录的实现源代码
Apr 25 Python
python实现二维插值的三维显示
Dec 17 Python
浅析PyTorch中nn.Linear的使用
Aug 18 Python
python统计指定目录内文件的代码行数
Sep 19 Python
Django-imagekit的使用详解
Jul 06 Python
python进行OpenCV实战之画图(直线、矩形、圆形)
Aug 27 Python
Django+Django-Celery+Celery的整合实战
Jan 20 Python
python实现剪贴板的操作
Jul 01 Python
python try...finally...的实现方法
Nov 25 #Python
通过Python pyecharts输出保存图片代码实例
Nov 25 #Python
如何基于Python和Flask编写Prometheus监控
Nov 25 #Python
python3爬虫中多线程进行解锁操作实例
Nov 25 #Python
mac系统下安装pycharm、永久激活、中文汉化详细教程
Nov 24 #Python
python 基于wx实现音乐播放
Nov 24 #Python
Python WebSocket长连接心跳与短连接的示例
Nov 24 #Python
You might like
神族 Protoss 历史背景
2020/03/14 星际争霸
使用php+Ajax实现唯一校验实现代码[简单应用]
2011/11/29 PHP
PHP使用Alexa API获取网站的Alexa排名例子
2014/06/12 PHP
PHP加密解密函数详解
2015/10/28 PHP
PHP基于堆栈实现的高级计算器功能示例
2017/09/15 PHP
php生成条形码的图片的实例详解
2017/09/13 PHP
js弹出模式对话框,并接收回传值的方法
2013/03/12 Javascript
Js Jquery创建一个弹出层可加载一个页面
2014/05/08 Javascript
AngularJS入门教程(一):静态模板
2014/12/06 Javascript
JQuery中节点遍历方法实例
2015/05/18 Javascript
原生JS实现平滑回到顶部组件
2016/03/16 Javascript
Javascript中引用类型传递的知识点小结
2017/03/06 Javascript
Vue自定义指令使用方法详解
2017/08/21 Javascript
js正则相关知识点专题
2018/05/10 Javascript
python实现代码行数统计示例分享
2014/02/10 Python
Python创建系统目录的方法
2015/03/11 Python
Python实现基于KNN算法的笔迹识别功能详解
2018/07/09 Python
django数据关系一对多、多对多模型、自关联的建立
2019/07/24 Python
python opencv图片编码为h264文件的实例
2019/12/12 Python
Python3.7+tkinter实现查询界面功能
2019/12/24 Python
python3 简单实现组合设计模式
2020/07/02 Python
matplotlib之pyplot模块之标题(title()和suptitle())
2021/02/22 Python
基于CSS3实现图片模糊过滤效果
2015/11/19 HTML / CSS
HTML5中的nav标签学习笔记
2016/06/24 HTML / CSS
Farfetch阿联酋:奢侈品牌时尚购物平台
2019/07/26 全球购物
iostream与iostream.h的区别
2015/01/16 面试题
.NET面试10题
2014/02/24 面试题
管理科学大学生求职信
2013/11/13 职场文书
软件部经理岗位职责范本
2014/02/25 职场文书
关于爱国的演讲稿
2014/05/07 职场文书
结婚保证书(卖身契)
2015/02/26 职场文书
预备党员半年考察意见
2015/06/01 职场文书
庆元旦主持词
2015/07/06 职场文书
十二月早安励志心语大全
2019/12/03 职场文书
浅谈Nginx 中的两种限流方式
2021/03/31 Servers
浅谈JS的二进制家族
2021/05/09 Javascript