如何检查代码在python中运行之前是否可能?
我试图检查某个分割语句是否可以在代码运行之前执行(没有字符串,零除以等),并给出错误。我不能使用异常并必须使用if语句。我知道如何检查每个条件,但我需要一个声明来检查整个分部是否可行。 这是我的代码:如何检查代码在python中运行之前是否可能?
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)
当然,最好的方法是尝试&失败。你永远不知道什么是不可行的或不可分割的,是什么原因。
但是,让我们假设您的输入数据是干净的,没有字符串,没有零,只是数字。那么你可以只是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
你可以走的更远,并假设& 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
此类“正常化”的部分,最少的整数分子分母&可能。对于任何值,包括浮点数,都可以分割,分母必须为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)
在这种情况下,你可以力分数有一个有限的denomiator,可能失去一些精度价值。例如,限制为6个位数逗号(即1/1000000
)后:
>>> Fraction(0.01).limit_denominator(1000000)
Fraction(1, 100)
这将捕获非数字值和零分母。
if (isinstance(ai, numbers.Number) and isinstance(bi, numbers.Number) and bi != 0)
当然,numbers
模块必须在此之前进口。但是,在if
语句中捕捉浮点溢出非常困难。
这工作。谢谢! – RBair
你也可以用一试功能做到这一点。例如:
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)
检查除以零是很容易的,检查数值只会有点困难。但是检查浮点溢出非常困难,没有异常处理。你需要检查溢出吗? –
你是指一个整体的划分,还是整数划分?因为除了字符串和零之外,每个数字都可以被其他数字整除(0和INF除外)。结果可能是分数。 –
不用担心溢出。它必须是整数除法。基本上,a和b都需要是列表,只包含int元素,b中不包含零,以便分区工作。就像我说的单独检查很容易,但我需要一个普通的声明。 – RBair