前言
本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理。
PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取
历史重构方法:
Python重构(一)
Python重构(二)
Python重构(三)
Python重构(四)
1. 打开文件时使用with以确保文件被关闭
Python中打开和使用文件的常见方式是:
file = open("welcome.txt")
data = file.read()
print(data)
file.close()
但是,如果在打开和关闭文件时抛出异常,对file.close()的调用可能会被跳过。解决这个问题的一种方法是使用try...finally结构确保文件将被关闭。
file = open("welcome.txt")
try:
data = file.read()
print(data)
finally:
file.close()
虽然解决了文件关闭问题,但它非常冗长。这正好可以用Python的context管理器来解决。在幕后,此行为与try ... finally行为相同。退出该代码块后,即使已引发异常,该文件也会立即为您关闭。
with open("welcome.txt") as file:
data = file.read()
print(data)
这段代码略短一些,更易于阅读,让您专注于重要的逻辑,而不是文件关闭的细节。
2. 使用default get简化字典访问
如果键存在,我们通常想从字典中选择某些内容,如果不存在,则使用默认值。一种方法是使用如下条件语句:
def pick_hat(available_hats: Dict[Label, Hat]):
if self.favourite_hat in available_hats:
hat_to_wear = available_hats[self.favourite_hat]
else:
hat_to_wear = NO_HAT
return hat_to_wear
一个简单的快捷方式是Python字典具有get()方法,此方法的第二个参数可以设置返回的默认值。因此,我们可以将上面的代码缩短为:
def pick_hat(available_hats: Dict[Label, Hat]):
hat_to_wear = available_hats.get(self.favourite_hat, NO_HAT)
return hat_to_wear
这简化了代码,消除了一些重复。需要注意的一点是,如果不传递默认值,它将使用“None”。
3. 简化列表访问
在Python中,您可以使用负索引访问列表的末尾。因此,my_list [-1]得到最后一个元素,my_list [-2]得到倒数第二个,依此类推。这意味着下面的代码:
a = [1, 2, 3]
last_element = a[len(a) - 1]
更简单:
a = [1, 2, 3]
last_element = a[-1]
4. 卫语句后去除不必要的else
一种常见的代码模式是在函数的开头设置一些保护子句,以检查是否满足了某些条件,并提前返回,否则将引发异常。
def f(a=None):
if a is None:
return 42
else:
# some long calculations
var = (i ** 2 for i in range(a))
return sum(var)
虽然这是完全有效的代码,但它可能会遇到过度嵌套的问题,特别是当函数的剩余部分相当长时。
这里,我们可以利用不需要else,if的主体通过return或raise结束。
def f(a=None):
if a is None:
return 42
# some long calculations
var = (i ** 2 for i in range(a))
return sum(var)
用这种方式使用一个或多个保护条件不会导致函数的其余部分缩进。一般来说,我们需要处理的缩进越少,代码就越容易理解。
5. 将for循环转换为对sum()的调用
很多编程都是将列表相加,Python有内置的sum()函数来帮助实现这一点。
你可以用下面的方式重写for循环:
Before:
total = 0
for hat in hats:
total += hat.price
After:
total = sum(hat.price for hat in hats)
这样代码更短,还有一个额外的好处就是代码明确地告诉您它试图做什么——将所有帽子的价格相加。
6. 提升返回到if
这是一种稍微简化代码的快速方法。在if的每个分支上设置一个值,然后立即返回,而不是直接从每个分支返回它。
这意味着代码如下:
def f():
if condition:
val = 42
else:
val = 0
return val
转为:
def f():
if condition:
return 42
else:
return 0
这就删除了一个不必要的中间变量,我们不得不在心里跟踪它。