1. 合并嵌套的 if 条件

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

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

合并之前:

  1. if a:

  2. if b:

  3. return c

合并后:

  1. if a and b:

  2. return c

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

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

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

  1. if sold > DISCOUNT_AMOUNT:

  2. total = sold * DISCOUNT_PRICE

  3. label = f'Total: {total}'

  4. else:

  5. total = sold * PRICE

  6. label = f'Total: {total}'

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

  1. if sold > DISCOUNT_AMOUNT:

  2. total = sold * DISCOUNT_PRICE

  3. else:

  4. total = sold * PRICE

  5. label = f'Total: {total}'

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

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

重构前:

  1. def get_content(entry):

  2. for block in entry.get_blocks():

  3. yield block

重构后:

  1. def get_content(entry):

  2. yield from entry.get_blocks()

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

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

  1. found = False

  2. for thing in things:

  3. if thing == other_thing:

  4. found = True

  5. break

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

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

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

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

5. 用[]替换list()

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

  1. x = []

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

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

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

  1. $ python3 -m timeit "x = list()"

  2. 5000000 loops, best of 5: 63.3 nsec per loop

  1. $ python3 -m timeit "x = []"

  2. 20000000 loops, best of 5: 15.8 nsec per loop

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

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

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

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

  1. for building in buildings:

  2. city = 'London'

  3. addresses.append(building.street_address, city)

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

  1. city = 'London'

  2. for building in buildings:

  3. addresses.append(building.street_address, city)

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

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理

想要获取更多Python学习资料可以加QQ:2955637827私聊或加Q群630390733大家一起来学习讨论吧!

6 个例子教你重构 Python 代码的更多相关文章

  1. 程序员式优雅表白,教你用python代码画爱心

    还能用python代码画爱心?还有这种操作?这是什么原理? 不相信python代码可以画爱心?先来一张效果图来看看效果吧! 用python代码画爱心的思路是怎样的? 1.怎么画心形曲线 2.怎么填满心 ...

  2. 手把手教你用Python代码实现微信聊天机器人 -- Python wxpy

    关注我,每天都有优质技术文章推送,工作,学习累了的时候放松一下自己. 本篇文章同步微信公众号 欢迎大家关注我的微信公众号:「醉翁猫咪」 来学习了,微信聊天机器人. 环境要求: Windows / Li ...

  3. 30行Python代码实现人脸检测

    参考OpenCV自带的例子,30行Python代码实现人脸检测,不得不说,Python这个语言的优势太明显了,几乎把所有复杂的细节都屏蔽了,虽然效率较差,不过在调用OpenCV的模块时,因为模块都是C ...

  4. 教你用一行Python代码实现并行(转)

    教你用一行Python代码实现并行 本文教你通过一行Python实现并行化. Python在程序并行化方面多少有些声名狼藉.撇开技术上的问题,例如线程的实现和GIL,我觉得错误的教学指导才是主要问题. ...

  5. 教你一招,提升你Python代码的可读性,小技巧

    Python的初学者,开发者都应该知道的代码可读性提高技巧,本篇主要介绍了如下内容: PEP 8是什么以及它存在的原因 为什么你应该编写符合PEP 8标准的代码 如何编写符合PEP 8的代码 为什么我 ...

  6. Python代码教你批量将PDF转为Word

    很多时候在学习时发现许多文档都是PDF格式,PDF格式却不利于学习使用,因此需要将PDF转换为Word文件,但或许你从网上下载了很多软件,但只能转换前五页(如WPS等),要不就是需要收费,那有没有免费 ...

  7. 【python】10分钟教你用python一行代码搞点大新闻

    准备 相信各位对python的语言简洁已经深有领会了.那么,今天就带大家一探究竟.看看一行python代码究竟能干些什么大新闻.赶紧抄起手中的家伙,跟我来试试吧. 首先你得先在命令行进入python. ...

  8. 教你阅读Python开源项目代码

    为什么要阅读开源代码 阅读 Python 开源项目代码主要有如下三个原因: 在工作过程中遇到一些问题 Google 和 StackOverFlow 等网站找不到解决办法,只能去翻源码. 对某些项目或者 ...

  9. 教你用Python Jupyter Notebook 制作代码分享 PPT

    PPT 是个强大的工具,但是笔者的 PPT 制作技术不咋地,所以之前的分享习惯使用 Jupyter Notebook + RISE,这样使用简单的 markdown 格式加上代码就足够做一次代码分享了 ...

随机推荐

  1. 对JVM的一个基础了解

    1.JVM范围 2.JVM和class文件 (1).JVM和Java语言无关,JVM是一种规范,任何语言只要能编译成class文件格式都能在JVM上运行 3.class文件格式 (1).class文件 ...

  2. 使用Python切片赋值

    解释器下运行以下代码:list1 = [4,5,6,7,8,9] list1[2:5] = ['a','b','c']结果是:[4, 5, 'a', 'b', 'c', 9]

  3. 记录一下超大list引起oom

    1.2g的堆内存 比较大的对象20w个,oom

  4. Error:Execution failed for task ':app:mergeDebugResources'. > Error: Some file crunching failed, see logs for details

    android studio中的资源文件命名是不能带有数字的,因为会与R类的资源ID起冲突,所以编译就发生了错误.

  5. 【GDOI2014模拟】JZOJ2020年8月14日T2 网格

    [GDOI2014模拟]JZOJ2020年8月14日T2 网格 题目 Time and Memory Limits Description 某城市的街道呈网格状,左下角坐标为A(0, 0),右上角坐标 ...

  6. 20200221_python虚拟环境在Windows下安装配置_virtualenv不是内部或外部命令也不是可运行的程序或批处理文件

    1. 使用管理员启动命令行; 2. 安装虚拟环境 a)      .\pip install virtualenv  -i https://pypi.douban.com/simple/ b)     ...

  7. 《Machine Learning in Action》—— 浅谈线性回归的那些事

    <Machine Learning in Action>-- 浅谈线性回归的那些事 手撕机器学习算法系列文章已经肝了不少,自我感觉质量都挺不错的.目前已经更新了支持向量机SVM.决策树.K ...

  8. C++20初体验——concepts

    引子 凡是涉及STL的错误都不堪入目,因为首先STL中有复杂的层次关系,在错误信息中都会暴露出来,其次这么多类和函数的名字大多都是双下划线开头的,一般人看得不习惯. 一个经典的错误是给std::sor ...

  9. 学习工具--Git

    前言 主要内容来源于廖雪峰网站,内容通俗易懂,有些地方用了Gif来演示,实用性超强.至于git的强大,就不强调很多了,熟练掌握它最好的还是在实际工程中,先做一个简单的总结吧. git简介 Git是目前 ...

  10. PyQt(Python+Qt)学习随笔:Qt Designer中部件的mouseTracking和tabletTracking属性

    在Qt Designer中的部件属性设置中,有mouseTracking和tabletTracking两个属性,这两个属性是跟踪鼠标或平板触控笔的移动轨迹的. 一.mouseTracking mous ...