瞧瞧,这样的代码才叫 Pythonic (二)

398次阅读  |  发布于3年以前

代码质量,是评价开发者的一个重要指标。

我曾经不止一次的提及过代码质量的重要性,优秀的代码,直接关乎可读性、维护成本等诸多方面的问题。

Python作为一种高级编程语言,对于语法的限制非常少,开发者可以忽略很多要点,同样可以满足自己的需要的功能,因此,代码质量开始被很多Python开发者忽视。

但是,要成为一名优秀的开发者,代码质量是永远无法绕开的话题。

今天,就来教大家如何写出简洁、干净的Python代码,来提升一下你的代码质量吧!

1. 合并嵌套条件语句

太多的嵌套,会使得代码变得非常难以理解,在Python中尤其如此,因为Python中没有括号来帮助描述不同的嵌套级别。

阅读深层嵌套的代码令人困惑,因为你必须跟踪哪些条件与哪些级别相关。

因此,我们力求在可能的情况下减少嵌套,并减少两个if条件可以组合使用的情况。

重构前

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进行抽取,不仅能够删除重复代码,还能够使代码逻辑更加清晰。

重构后

if sold > DISCOUNT_AMOUNT:
    total = sold * DISCOUNT_PRICE
else:
    total = sold * PRICE
label = f'Total: {total}'

3. 利用any()替代for循环

一个常见的问题,我们需要查找某个条件是否满足集合中一个或所有项目的条件。

这时,很多同学都会想起for循环。

found = False
for thing in things:
    if thing == other_thing:
        found = True
        break

其实,Python中有两个函数all()any(),能够使这段代码变得更加清晰、简洁:

found = any(thing == other_thing for thing in things)

这个应该很容易理解,如果至少有一个满足any()内部条件,它会返回True,反之返回False

4. 把重复代码块合并到条件中

就像前面所说的那样,删除重复代码块,是提升代码常用的一种方法。

其中,if...elif就是一个非常值得关注的点。

def process_payment(payment):
    if payment.currency == 'USD':
        process_standard_payment(payment)
    elif payment.currency == 'EUR':
        process_standard_payment(payment)
    else:
        process_international_payment(payment)

从这段代码中可以看出,有很多冗余的代码可以优化,我们可以通过or把多余的语句合并起来:

def process_payment(payment):
    if payment.currency == 'USD' or payment.currency == 'EUR':
        process_standard_payment(payment)
    else:
        process_international_payment(payment)

5. 删除没必要的调用keys()

字典是由一个个的键值对组成的,如果你遍历字典时只需要访问键,用不到值,有很多同学会用下面这种方式:

for currency in currencies.keys():
    process(currency)

在这种情况下,不需要调用keys(),因为遍历字典时的默认行为是遍历键。

for currency in currencies:
    process(currency)

现在,该代码更加简洁,易于阅读,并且避免调用函数会带来性能改进。

6. 简化序列比较

我们经常要做的是在尝试对列表或序列进行操作之前检查列表或序列是否包含元素。

if len(list_of_hats) > 0:
    hat_to_wear = choose_hat(list_of_hats)

使用Python的方法则更加简单:如果Python列表和序列具有元素,则返回为True,否则为False:

if list_of_hats:
    hat_to_wear = choose_hat(list_of_hats)

7. 仅使用一次的内联变量

我们在很多代码中经常看到,有些同学分配结果给变量,然后马上返回它,例如,

def state_attributes(self):
    """Return the state attributes."""
    state_attr = {
        ATTR_CODE_FORMAT: self.code_format,
        ATTR_CHANGED_BY: self.changed_by,
    }
    return state_attr

如果直接返回,则更加直观、简洁,

def state_attributes(self):
    """Return the state attributes."""
    return {
        ATTR_CODE_FORMAT: self.code_format,
        ATTR_CHANGED_BY: self.changed_by,
    }

这样可以缩短代码并删除不必要的变量,从而减轻了读取函数的负担。

8. 将条件简化为return语句

如果,我们实现的函数要返回一个布尔型的结果,通常会这样去做,

def function():
    if isinstance(a, b) or issubclass(b, a):
        return True
    return False

但是,对比这样,直接返回结果会更加明智:

def function():
    return isinstance(a, b) or issubclass(b, a)

结语

从本文介绍的内容来看,这些知识点并不是很难,对于很多同学,可以秒级就能够理解其中的要点。

我认为这些更像是一种习惯,习惯性的去思考如何重构代码,如何让代码质量更进一步。

如果养成这些习惯,融为自己的一部分,那么就会在不知不觉中就会写出高质量的Python代码。

当然,提升代码的路上,要学习的远不止本文介绍的这些。

希望通过本文的介绍能够起到一个抛砖引玉的作用,来引导大家挖掘更多提升代码质量的方法。

Copyright© 2013-2020

All Rights Reserved 京ICP备2023019179号-8