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大家一起来学习讨论吧!

最新文章

  1. C#之方法的声明与调用
  2. <更新日期03-31-2016> 复利计算5.0 <已改进>
  3. 自动重启sqlserver服务
  4. scrollview技巧
  5. JDBC连接sql server数据库及其它
  6. oracle定时运行 存储过程
  7. 输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
  8. 记录一下MYSQL的SQL语法
  9. JavaScript中五种常见运算符
  10. MVC4 学习笔记01
  11. Ejb in action(七)——message与JMS
  12. mac/Linux/centos ssh连接服务器以及跳板机,实现类型Xshell 功能
  13. (转)Spring事务管理详解
  14. 第二次oo博客作业--多线程电梯
  15. 直接通过Binder的onTransact完成跨进程通信
  16. String类常用方法练习
  17. Android-Java构造代码块&构造方法隐式三行
  18. [py]python中的特殊类class type和类的两面性图解
  19. 杂项:IIS
  20. Oil Deposits 搜索 bfs 强联通

热门文章

  1. idea中安装阿里巴巴的代码规范插件
  2. Jmeter测试TCP协议
  3. iOS 百度地图使用详解
  4. 实用主义当道——GitHub 热点速览 Vol.48
  5. java41
  6. IDEA社区版(Community)和付费版(UItimate)的区别
  7. 【NOIP2015模拟11.5】JZOJ8月5日提高组T1 俄罗斯套娃
  8. 数据库:Flask-SQLAlchemy
  9. 并发编程实战-ConcurrentHashMap源码解析
  10. Vue3教程:Vue 3.x 快在哪里?