问题描述
我有太多相同的 try/except 语句。编写这样的代码的最佳方法是什么?也许创建一些函数,它需要像 g = k/y 这样的语句并返回结果或 0?
try:
g = k/y
except ZeroDivisionError:
g = 0.00
try:
m = e/w
except ZeroDivisionError:
m = 0.00
try:
q = w/h
except ZeroDivisionError:
q = 0.00
try:
f = I/O
except ZeroDivisionError:
f = 0.00
解决方法
实际检查该条件怎么样?
g = k/y if y != 0 else 0.0
,
你可以把它变成一个函数!以下是包括计时在内的几种方法。
import time
def safe_divide(a,b):
'Divides a/b,returns 0 if b is 0'
return a/b if b != 0 else 0
def safe_divide_try_except(a,b):
'Tries to divide a/b,returns 0 if b is 0'
try:
return a/b
except ZeroDivisionError:
return 0
def time_function(divide_function,function_name,list_of_divisors,divisor_name):
start_time = time.time()
for a,b in list_of_divisors:
divide_function(a,b)
end_time = time.time()
time_elapsed = end_time - start_time
print(f'{function_name} {divisor_name} Time: {time_elapsed}')
exceptions = [(a,0) for a in range(1000000)]
non_exceptions = [(a,3) for a in range(100000)]
time_function(safe_divide,"Safe Divide",exceptions,"Zero Divide")
time_function(safe_divide_try_except,"Try Except","Zero Divide")
time_function(safe_divide,non_exceptions,"Safe Divide")
time_function(safe_divide_try_except,"Safe Divide")
输出:
Safe Divide Zero Divide Time: 0.10719704627990723
Try Except Zero Divide Time: 0.34455204010009766
Safe Divide Safe Divide Time: 0.016250133514404297
Try Except Safe Divide Time: 0.01636195182800293
根据我的实验,看起来使用三元运算符处理零情况的速度更快。
,您可以创建一个执行此操作的函数并在需要时调用它:
def div_or_zero(a,b):
try:
return a / b
except ZeroDivisionError:
return 0.0
g = div_or_zero(k,y)
m = div_or_zero(e,w)
q = div_or_zero(w,h)
f = div_or_zero(i,o)