重构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解析最简单的验证码
Jan 07 Python
rabbitmq(中间消息代理)在python中的使用详解
Dec 14 Python
python+opencv识别图片中的圆形
Mar 25 Python
python 地图经纬度转换、纠偏的实例代码
Aug 06 Python
Python读取txt内容写入xls格式excel中的方法
Oct 11 Python
Django组件之cookie与session的使用方法
Jan 10 Python
计算机二级python学习教程(2) python语言基本语法元素
May 16 Python
python生成requirements.txt的两种方法
Sep 18 Python
Python count函数使用方法实例解析
Mar 23 Python
使用OpenCV获取图像某点的颜色值,并设置某点的颜色
Jun 02 Python
Python定义一个函数的方法
Jun 15 Python
Python应用自动化部署工具Fabric原理及使用解析
Nov 30 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
咖啡产品发展的三大浪潮
2021/03/04 咖啡文化
php数据库抽象层 PDO
2011/05/07 PHP
PHP根据IP判断地区名信息的示例代码
2014/03/03 PHP
PHP获取昨天、今天及明天日期的方法
2016/02/03 PHP
ThinkPHP 3使用OSS的方法
2018/07/19 PHP
Yii框架常见缓存应用实例小结
2019/09/09 PHP
用javascript getComputedStyle获取和设置style的原理
2008/10/10 Javascript
jquery 学习之一 对象访问
2010/11/23 Javascript
javascript处理table表格的代码
2010/12/06 Javascript
JavaScript字符串对象的concat方法实例(用于连接两个或多个字符串)
2014/10/16 Javascript
node.js中的buffer.write方法使用说明
2014/12/10 Javascript
JS实现的5级联动Select下拉选择框实例
2015/08/17 Javascript
jQuery实现ctrl+enter(回车)提交表单
2015/10/19 Javascript
Flow之一个新的Javascript静态类型检查器
2015/12/21 Javascript
D3.js实现文本的换行详解
2016/10/14 Javascript
AngularJS 应用身份认证的技巧总结
2016/11/07 Javascript
使用UrlConnection实现后台模拟http请求的简单实例
2017/01/04 Javascript
微信小程序开发入门基础教程
2017/04/19 Javascript
微信小程序授权登录及解密unionId出错的方法
2018/09/26 Javascript
Android 自定义view仿微信相机单击拍照长按录视频按钮
2019/07/19 Javascript
js禁止查看源文件屏蔽Ctrl+u/s、F12、右键等兼容IE火狐chrome
2020/10/01 Javascript
python使用Plotly绘图工具绘制水平条形图
2020/03/25 Python
纯python进行矩阵的相乘运算的方法示例
2019/07/17 Python
python使用yield压平嵌套字典的超简单方法
2019/11/02 Python
python3中编码获取网页的实例方法
2020/11/16 Python
CSS3中HSL和HSLA的简单使用示例
2015/07/14 HTML / CSS
中国旅游网站:同程旅游
2016/09/11 全球购物
澳大利亚儿童和婴儿产品在线商店:Lime Tree Kids
2017/10/05 全球购物
adidas瑞典官方网站:购买阿迪达斯鞋子和运动服
2019/12/11 全球购物
请说出以下代码输出什么
2013/08/30 面试题
机电系毕业生求职信
2014/07/11 职场文书
小学假期安全广播稿
2014/09/28 职场文书
实习证明格式范文
2014/10/14 职场文书
2019安全宣传标语大全
2019/08/14 职场文书
如何理解Vue简单状态管理之store模式
2021/05/15 Vue.js
nginx rewrite功能使用场景分析
2022/05/30 Servers