在 Python 中处理重复性 ZeroDivision 异常的最佳实践是什么?

问题描述

我有太多相同的 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)