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)
我正在尝试检查某个除法语句是否可以在代码运行之前执行(没有字符串,没有被零除等...)并给我一个错误。我不能使用异常,必须使用 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)