重构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的Django框架中实现Hacker News的一些功能
Apr 17 Python
玩转python爬虫之爬取糗事百科段子
Feb 17 Python
python os.listdir按文件存取时间顺序列出目录的实例
Oct 21 Python
Python pandas DataFrame操作的实现代码
Jun 21 Python
详解python 利用echarts画地图(热力图)(世界地图,省市地图,区县地图)
Aug 06 Python
对Python 中矩阵或者数组相减的法则详解
Aug 26 Python
python3-flask-3将信息写入日志的实操方法
Nov 12 Python
python 读取二进制 显示图片案例
Apr 24 Python
详解Windows下PyCharm安装Numpy包及无法安装问题解决方案
Jun 18 Python
Python接口测试环境搭建过程详解
Jun 29 Python
Expected conditions模块使用方法汇总代码解析
Aug 13 Python
python如何调用php文件中的函数详解
Dec 29 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
《雄兵连》《烈阳天道》真的来了
2020/07/13 国漫
sourcesafe管理phpproj文件的补充说明(downmoon)
2009/04/11 PHP
php各种编码集详解和以及在什么情况下进行使用
2011/09/11 PHP
Laravel 验证码认证学习记录小结
2019/12/20 PHP
javascript Demo模态窗口
2009/12/06 Javascript
DIV外区域Click后关闭DIV的实现代码
2011/12/21 Javascript
js判断url是否有效的两种方法
2014/03/04 Javascript
jquery常用特效方法使用示例
2014/04/25 Javascript
jquery ui resize 中border-box的bug修正
2015/04/26 Javascript
JavaScript中的getTime()方法使用详解
2015/06/10 Javascript
js剪切板应用clipboardData实例解析
2016/05/29 Javascript
AngularJS中比较两个数组是否相同
2016/08/24 Javascript
javascript实现根据汉字获取简拼
2016/09/25 Javascript
微信小程序 简单DEMO布局,逻辑,样式的练习
2016/11/30 Javascript
微信小程序 ES6Promise.all批量上传文件实现代码
2017/04/14 Javascript
讲解vue-router之什么是编程式路由
2018/05/28 Javascript
Angular-UI Bootstrap组件实现警报功能
2018/07/16 Javascript
JavaScript判断对象和数组的两种方法
2019/05/31 Javascript
Angular之jwt令牌身份验证的实现
2020/02/14 Javascript
详解JS预解析原理
2020/06/16 Javascript
Python中处理字符串之endswith()方法的使用简介
2015/05/18 Python
tensorflow中next_batch的具体使用
2018/02/02 Python
详解Python locals()的陷阱
2019/03/26 Python
解决pyqt5中QToolButton无法使用的问题
2019/06/21 Python
python3 deque 双向队列创建与使用方法分析
2020/03/24 Python
分享一枚pycharm激活码适用所有pycharm版本我的pycharm2020.2.3激活成功
2020/11/20 Python
Python爬虫简单运用爬取代理IP的实现
2020/12/01 Python
迎八一活动主题
2014/01/31 职场文书
材料专业毕业生求职信
2014/02/26 职场文书
公司授权委托书格式样本
2014/10/01 职场文书
房屋租赁协议书
2014/10/18 职场文书
群众路线教育实践活动实施方案
2014/10/31 职场文书
2014年妇幼保健工作总结
2014/12/08 职场文书
幼儿园园长六一致辞
2015/07/31 职场文书
2016年三严三实党课学习心得体会
2016/01/06 职场文书
Java使用HttpClient实现文件下载
2022/08/14 Java/Android