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)

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

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

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

python复杂代码示例_6 个例子教你重构 Python 代码相关推荐

  1. 【Python】Python实战从入门到精通之三 -- 教你使用Python中条件语句

    本文是Python实战–从入门到精通系列的第三篇文章: Python实战从入门到精通第1讲–Python中的变量和数据类型 Python实战从入门到精通第2讲–Python中列表操作详解 Python ...

  2. 【Python】Python实战从入门到精通之二 -- 教你使用Python中列表操作

    本文是Python实战–从入门到精通系列的第二篇文章: [Python]Python实战从入门到精通之一 – 教你深入理解Python中的变量和数据类型 Python实战从入门到精通之二 – 教你使用 ...

  3. 【Python】Python实战从入门到精通之四 -- 教你使用Python中字典

    本文是Python实战–从入门到精通系列的第四篇文章: Python实战从入门到精通第一讲–Python中的变量和数据类型 Python实战从入门到精通第二讲–Python中列表操作详解 Python ...

  4. Java 泛型(generics)详解及代码示例、Java 类型通配符详解及代码示例

    Java 泛型(generics)详解及代码示例.Java 类型通配符详解及代码示例 - 概念 Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制 ...

  5. 避免代码冗余,使用接口和泛型重构Java代码

    转载自 避免代码冗余,使用接口和泛型重构Java代码 在使用动态语言和.NET工作了若干年后,我又回到老本行–Java开发.在Ruby中,清除代码冗余是非常方便的,而在Java中则需要结合接口和泛型实 ...

  6. 好玩的python代码示例-这可能是最好玩的python GUI入门实例!

    image.png 简单的说,GUI编程就是给程序加上图形化界面. python的脚本开发简单,有时候只需几行代码就能实现丰富的功能,而且python本身是跨平台的,所以深受程序员的喜爱. 如果给程序 ...

  7. python入门代码示例-这可能是最好玩的python GUI入门实例!

    image.png 简单的说,GUI编程就是给程序加上图形化界面. python的脚本开发简单,有时候只需几行代码就能实现丰富的功能,而且python本身是跨平台的,所以深受程序员的喜爱. 如果给程序 ...

  8. python网页爬虫循环获取_手把手教你用 Python 搞定网页爬虫

    原标题:手把手教你用 Python 搞定网页爬虫 编译:欧剃 作为数据科学家的第一个任务,就是做网页爬取.那时候,我对使用代码从网站上获取数据这项技术完全一无所知,它偏偏又是最有逻辑性并且最容易获得的 ...

  9. python处理时间序列非平稳_手把手教你用Python处理非平稳时间序列

    简介 预测一个家庭未来三个月的用电量,估计特定时期道路上的交通流量,预测一只股票在纽约证券交易所交易的价格--这些问题都有什么共同点? 它们都属于时间序列数据的范畴!如果没有"时间" ...

最新文章

  1. Nginx源码分析:epoll事件处理模块概述
  2. 关于Horizon 7 Agent与远程桌面(mstsc)兼容性问题解决办法
  3. Shell 编程快速入门
  4. 【算法入门漫画】:什么是字符串匹配算法?
  5. (011)XHTML文档之列表
  6. asp.net core程序在k8s中基于rabbitmq队列消息数的HPA实践!
  7. 妖帝q群机器人_有关酷Q 晨风机器人,契约 qqlite qqlight ,mypc等QQ机器人关停一事的一点想法...
  8. 计算机维修法宝,计算机的三大法宝
  9. 拍照尺寸 ios_即将收费!11款价值80元iOS限免应用,全部免费下载
  10. 【Java】编程思想汇总ing
  11. 国内优秀的PHP后台管理系统(CMS)整理
  12. WPS Office 2021 Mac免费办公软件
  13. 怎样绘制产品流程图?绘制的技巧分享
  14. 最常用的计算机色彩表示方法——RGB模式与CMYK模式
  15. 英文 SCI 论文写作常用句式(保持更新)
  16. 用DIV+CSS技术设计的网页与实现制作【体育文化】dreamweaver学生网页设计
  17. Axure长页面滚动拖动制作
  18. otg usb 定位_USB OTG插入检测识别
  19. 如何用VB实现半透明控件
  20. 近10年的网盘发展史(那些年你的网盘存了多少资料)

热门文章

  1. 一个基于运气的数据结构,你猜是啥?
  2. 一行代码能做什么? 看到最后一个我终于忍不住...
  3. Java变量声明在循环体内还是循环体外,你用哪一个?
  4. Sutton 强化学习, 21 点游戏的策略蒙特卡洛值预测
  5. 别再一知半解啦,索引其实就这么回事!
  6. Android Bitmap史上最详细全解 | 原力计划
  7. 苹果阻止上架的这款软件,到底有多可恶?
  8. Github 开源趋势榜 TOP 1:英伟达升级发布二代 StyleGAN!
  9. HTML + CSS 为何得不到编程界的认可?
  10. 云原生与数据中台,企业数字化转型的“正确打开方式”