前言
本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理。
PS:如有需要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,可以让我们更专注于真正重要的代码。