python代码运行前如何判断是否可以除法?

How to check if a division is possible before the code runs in python?

我正在尝试检查某个除法语句是否可以在代码运行之前执行(没有字符串,没有被零除等...)并给我一个错误。我不能使用异常,必须使用 if 语句。我知道如何检查每个条件,但我需要一个语句来检查是否可以进行除法。 这是我的代码:

a = input("Enter first list:")
b = input("Enter second list:")
def my_divide(a,b):
    if  (a statement to check if [(ai/bi) for ai, bi in zip(a, b)] would work):
        return [(ai/bi) for ai, bi in zip(a, b)]
    else:
        return [], "Something is wrong. Can't perform division"

print my_divide(a,b)

这将捕获非数值和零分母。

if (isinstance(ai, numbers.Number) and isinstance(bi, numbers.Number) and bi != 0)

当然,numbers模块必须在此之前导入。但是,在 if 语句中捕获浮点溢出非常困难。

当然,最好的方法是尝试并失败。你永远不知道什么是不可实现的或不可分割的,以及出于什么原因。

但是,我们假设您的输入数据是干净的,没有字符串,没有零,只有数字。然后你可以 print('YES'),因为每个数字都可以被其他所有数字(0 和 +INF/-INF 除外)整除,结果为小数。

所以在那种情况下问题很奇怪。但是既然问了这个问题,我假设你想要一个整数除法。

对于整数除法,对于手头的整数,您必须检查 a % b(除法余数)是否为零,这意味着 a 可整除的 来自 b:

if all(ai % bi == 0 for ai, bi in zip(a, b)):
    pass

或者,相同的:

if all(not ai % bi for ai, bi in zip(a, b)):
    pass

您可以更进一步,假设 a & b 不仅包含整数,还包含浮点数。在这里,stdlib 的 fractions 模块来拯救:

>>> from fractions import Fraction

>>> f = Fraction(10, 2)
>>> f.numerator
5
>>> f.denominator
1

>>> f = Fraction(10, 3)
>>> f.numerator
10
>>> f.denominator
3

>>> f = Fraction(2.5)
>>> f.numerator
5
>>> f.denominator
2

这class "normalizes" 分子和分母尽可能小的整数分数。对于任何可整除的值(包括浮点数),分母必须为 1.

这里,2.5能被0.5整除无余数:

>>> f = Fraction(2.5) / Fraction(0.5)
>>> f.numerator
5
>>> f.denominator
1

检查:

if all((Fraction(ai) / Fraction(bi)).denominator == 1 for ai, bi in zip(a, b)):
    pass

PS:但是要注意传入数字的精度问题。例如,0.01 不会像您期望的那样是 1/100 的一小部分,而是完全糟糕的东西:

>>> Fraction(0.01)
Fraction(5764607523034235, 576460752303423488)

在这种情况下,您可以强制 分数具有有限的分母,可能会损失一些值的精度。例如,限制为逗号后的 6 位数字(即 1/1000000):

>>> Fraction(0.01).limit_denominator(1000000)
Fraction(1, 100)

您也可以使用 try 函数来完成此操作。类似于:

def my_divide(a, b):
    quotient = []
    for ai, bi in zip(a, b):
        try:
            quotient.append(ai/bi)
        except ZeroDivisionError:
            quotient.append('Something is wrong. Cannot perform division')
    return quotient

print my_divide(a, b)