Python重构(四)

前言

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理。

PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取

python免费学习资料、代码以及交流解答点击即可加入

历史重构方法:

Python重构(一)
Python重构(二)
Python重构(三)

编写干净的,Python式的代码就是要尽可能地使其易于理解,但又要简明扼要。以下是有关Python重构的系列文章的第三部分,第一部分见此,第二部分见此。本系列的重点是为什么这样做是好的做法,而不仅仅是教你如何做。

1. 在条件中合并重复的代码块

编码时,我们应时刻谨记不要使用重复的代码,code review时尽量找到重复代码进行重构。如果在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)

现在,如果我们需要更改process_standard_payment(payment)行的逻辑,只需要在一个地方进行修改。如果这些代码包含多行,这样做就能减小代码出现bug的概率。

2. 用in操作符替换同一个变量的多次比较

让我们看看能否进一步完善前面的代码。我们经常将一个值与其他几种可能的值进行比较。在下的代码中,我们必须每一个进行检查,然后进行布尔操作。

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

使用in操作符并将要比较的值放在集合中,可以简化操作。

def process_payment(payment):
    if payment.currency in ['USD', 'EUR']:
        process_standard_payment(payment)
    else:
        process_international_payment(payment)

这样就避免了一些重复代码,代码也更可读容易理解。

3. 使用or简化if表达式

如果需要设置一个值(如果它的值为True),否则使用默认值。可以写成如下形式:

if input_currency:
    currency = input_currency
else:
    currency = DEFAULT_CURRENCY

或者使用if表达式

currency = input_currency if input_currency else DEFAULT_CURRENCY

两者都可以简化为如下所示,这更易于阅读,并避免了input_currency的重复。

currency = input_currency or DEFAULT_CURRENCY

因为先求左边的值。如果它的值为True,那么currency将被设置为input_currency,右边将被忽略。如果左边计算结果为False,则右边将被计算,currency将被设置为DEFAULT_CURRENCY。

4. 用直接引用替换for循环中的索引

for循环中经常使用range(len(list))来生成一个可以遍历的数字范围。

for i in range(len(currencies)):
    print(currencies[i])

如果索引 i 仅用于列表访问,则可以通过直接遍历列表来改进代码,如下面的示例所示。

for currency in currencies:
    print(currency)

这段代码更容易理解,也不那么混乱。特别是能够为currencies使用有意义的名称,这大大提高了d代码可读性。

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

有时,在迭代字典时,只需要使用字典的键。

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

在这种情况下,对keys()的调用是不必要的,因为在字典上迭代的默认行为是遍历键。

for currency in currencies:
    process(currency)

现在,代码变得更清晰、更容易阅读,并且避免函数调用将产生小小的性能改进。

6. 将手动循环计数器替换为调用枚举

在遍历一个列表时,有时需要访问一个循环计数器,它会让我们知道正在使用的元素的索引。很可能写成如下的代码:

i = 0
for currency in currencies:
    print(i, currency)
    i += 1

不过,有一个内置的Python函数enumerate,可以直接生成索引,删除两行不需要的代码。

for i, currency in enumerate(currencies):
    print(i, currency)

在阅读代码时,我们不必考虑变量 i 的初始化与每一次迭代时让i自增1,可以让我们更专注于真正重要的代码。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值