当前位置: 首页 > 后端技术 > Python

6个例子教你重构Python代码

时间:2023-03-26 01:11:04 Python

编写干净的Pythonic代码是为了使其尽可能易于理解,同时又简洁。所以需要对代码进行重构,让代码简洁易懂。本文的重点是讨论为什么这些重构是好主意,而不仅仅是如何去做。1.Mergenestedifconditions过多的嵌套会使代码难以理解,尤其是在Python中,它没有括号来帮助分隔不同层次的嵌套。阅读深度嵌套的代码可能会令人沮丧,因为您必须弄清哪些条件属于哪个级别。因此,我们应该尽可能减少嵌套。如果两个条件可以用and组合,会比嵌套更易读。合并前:ifa:ifb:returnc合并后:ifaandb:returnc2。将重复代码移到条件语句之外我们应该始终寻找删除重复代码的方法。这是提高编码技能的好方法。有时,代码在条件的两个分支上重复出现,这意味着这段代码将始终被执行。所以可以把这段重复的代码移出条件,在条件外执行。ifsold>DISCOUNT_AMOUNT:total=sold*DISCOUNT_PRICElabel=f'Total:{total}'else:total=sold*PRICElabel=f'Total:{total}'通过将标签变量的赋值移动到条件之外,我们删除了重复的代码行,并阐明了条件实际控制的内容,即计算总数。ifsold>DISCOUNT_AMOUNT:total=sold*DISCOUNT_PRICEelse:total=sold*PRICElabel=f'Total:{total}'3.将内循环中的yield替换为yieldfromPython有相应的yieldfromforcollections。因此无需使用for循环遍历集合。这使代码更短,并删除了for中的额外变量。并且在去掉for循环之后,yieldfrom让程序的效率提升了15%左右。重构前:defget_content(entry):forblockinentry.get_blocks():yieldblock重构后:defget_content(entry):yieldfromentry.get_blocks()4.使用any()而不是常见的for循环模式是我们需要找出集合中的一项或多项是否满足某些条件。这可以用for循环来完成,例如:found=Falseforthinginthings:ifthing==other_thing:found=Truebreak更简洁的方法是使用Python的any()和all()内置函数来清楚地显示代码的意图。found=any(thing==other_thingforthinginthings)any()将在至少一个元素的计算结果为True时返回True,而all()仅在所有元素的计算结果为True时返回True。如果对any()的调用找到一个计算结果为True的元素,它可以立即返回。5.用[]替换list()创建列表最简洁和Pythonic的方法是使用[]。x=[]x=['first','second']有一个额外的优势,它是提高程序性能的好方法。以下是更改前后的时间比较:$python3-mtimeit"x=list()"5000000loops,bestof5:63.3nsecperloop$python3-mtimeit"x=[]"20000000loops,bestof5:每个循环15.8纳秒出于相同的原因和性能,请使用{}而不是dict()。6.将重复的语句移出for/while循环将“未更改”的语句移出循环。如果一条语句只是设置一些变量供循环使用,则它不需要在循环中。循环本身就很复杂,因此在编写循环时,请记住这一点,以使其更短且更易于理解。在这个例子中,city变量在循环中被赋值,但它只被读取而没有被改变。forbuildinginbuildings:city='London'addresses.append(building.street_address,city)所以将它移出是安全的,这更清楚地表明相同的城市值将应用于每个建筑物变量。city='London'forbuildinginbuildings:addresses.append(building.street_address,city)这也提高了程序性能,因为每次循环运行时都会执行if循环中的任何语句。花在这些多次执行上的时间是浪费的,因为它只需要执行一次。如果该语句涉及对数据库的调用或其他耗时的任务,那么这种节省可能会很重要。以上就是本次分享的全部内容。想了解更多python知识,请前往公众号:Python编程学习圈,发“J”免费领取,每日干货分享