如何检查代码在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) 
+0

检查除以零是很容易的,检查数值只会有点困难。但是检查浮点溢出非常困难,没有异常处理。你需要检查溢出吗? –

+0

你是指一个整体的划分,还是整数划分?因为除了字符串和零之外,每个数字都可以被其他数字整除(0和INF除外)。结果可能是分数。 –

+0

不用担心溢出。它必须是整数除法。基本上,a和b都需要是列表,只包含int元素,b中不包含零,以便分区工作。就像我说的单独检查很容易,但我需要一个普通的声明。 – RBair

当然,最好的方法是尝试&失败。你永远不知道什么是不可行的或不可分割的,是什么原因。

但是,让我们假设您的输入数据是干净的,没有字符串,没有零,只是数字。那么你可以只是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) 
+0

这正是我需要的!非常感谢! – RBair

+0

@RBair我已经在a&b中扩展了float值的答案。 –

+0

谢谢!有可能做一些关于字符串的事情吗?当我将一个字符串放入列表中时,它给了我一个“不受支持的操作数类型(%):'int'和'str'”错误而不是传递。 – RBair

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

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

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

+0

这工作。谢谢! – 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)