重构Python代码的六个实例
前言
对自己写的冗长代码,想重构但又无思路?小编整理了介绍python代码重构优化的一些方法,助你一臂之力。
编写干净的Pythonic代码就是尽可能使其易于理解,但又简洁。所以重构代码让代码简洁易理解是很有必要的。
本文重点是想跟大家探讨为什么这些重构是好想法,而不仅仅是如何做。
1.合并嵌套的if条件
太多的嵌套会使代码难以理解,这在Python中尤为如此,因为Python没有括号来帮助区隔不同的嵌套级别。
阅读深度嵌套的代码容易让人烦躁,因为你必须理清哪些条件属于哪一级。因此,我们应尽可能减少嵌套,如果两个条件可以用and合在一起,会比嵌套更易读。
合并之前:
ifa: ifb: returnc
合并后:
ifaandb: returnc
2.将重复的代码移到条件语句之外
我们应该始终寻找移除重复代码的方法。这是提升代码能力的好办法。
有时,在条件的两个分支上出现重复代码,这意味这段代码将始终执行。因此这段重复的代码可以从条件中移出,放在条件之外执行。
ifsold>DISCOUNT_AMOUNT: total=sold*DISCOUNT_PRICE label=f'Total:{total}' else: total=sold*PRICE label=f'Total:{total}'
通过将对label变量赋值移到到条件之外,我们删除了重复的代码行,并明确了条件实际控制的内容,就是计算total。
ifsold>DISCOUNT_AMOUNT: total=sold*DISCOUNT_PRICE else: total=sold*PRICE label=f'Total:{total}'
3.将内部循环中的yield替换为yieldfrom
经常忽略的一个小窍门是Python的yield关键字有对应的为collections准备的yieldfrom。因此无需使用for循环遍历集合。这使代码变短,并删除for中的额外变量。而且消除for循环后,yieldfrom使程序运行效率提高约15%。
重构前:
defget_content(entry): forblockinentry.get_blocks(): yieldblock
重构后:
defget_content(entry): yieldfromentry.get_blocks()
4.使用any()而不是用于循环
常见的模式是,我们需要查找是否集合中的一个或多个项符合某些条件。这可以通过for循环完成,例如:
found=False forthinginthings: ifthing==other_thing: found=True break
更简洁的方法,是使用Python的any()和all()内置函数,来清楚地显示代码的意图。
found=any(thing==other_thingforthinginthings)
当至少有一个元素计算为True时,all()将返回True,只有当所有元素都计算为True时,all()将返回True。
如果对any()的调用找到一个值值为True的元素,它可以立即返回。
5.用[]替换list()
创建列表的最简洁和Pythonic的方法是使用[]。
x = [] x=['first','second']
这样做有额外的优点:是一个很好的改进程序性能的方法。
以下是更改之前和之后的时间对比:
$python3-mtimeit"x=list()" 5000000loops,bestof5:63.3nsecperloop
$python3-mtimeit"x=[]" 20000000loops,bestof5:15.8nsecperloop
同样的原因和性能表现,使用{}替代dict()。
6.将重复执行的语句移出for/while循环
将“不变的”语句从循环中移出。如果某条语句只是设置了一些变量供循环使用,则不需要在循环中。循环本身就是复杂的,因此在编写循环时,应牢记,使其更短、更容易理解。
在此示例中,city变量在循环中赋值,但它只读取且不更改。
forbuildinginbuildings: city='London' addresses.append(building.street_address,city)
因此,将其移出是安全的,这更清楚地说明,相同的city值将应用于每个building变量。
city='London' forbuildinginbuildings: addresses.append(building.street_address,city)
这也是提高了程序性能,因为如果循环中的任何语句将在每次循环运行时执行。在这些多次执行上花费的时间属于浪费,因为它只需要执行一次。如果语句涉及对数据库的调用或其他耗时的任务,则这种节省可能非常重要。
参考链接:
https://sourcery.ai/blog/explaining-refactorings-1/
总结
到此这篇关于重构Python代码的文章就介绍到这了,更多相关重构Python代码内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!