共计 1961 个字符,预计需要花费 5 分钟才能阅读完成。
编写洁净的 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 时,any() 将返回 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 常识欢送返回公众号:Python 编程学习圈,发送“J”即可收费获取,每日干货分享