2017-10-15 8 views
0

コードが実行されてエラーが発生する前に、特定の除算文を実行できるかどうかをチェックしようとしています(文字列がない、ゼロ除算などがありません)。私は例外を使用することはできませんし、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

一般的な除算、または整数除算を意味しますか?なぜなら、文字列とゼロを別にすれば、すべての数値は1つおきの数で割り切れるからです(0とINFを除く)。しかし、結果は分数である可能性があります。 –

+0

オーバーフローの心配はありません。それは整数除算でなければなりません。基本的には、aとbの両方がリストである必要があり、int要素のみを含み、除算が機能するためにはbに0は含まれません。私は個人的にチェックするのは簡単だと言いましたが、私は全員のために一般的な声明が必要です。 – RBair

答えて

1

最善の方法は、もちろん&が失敗することです。あなたは、何ができないのか分裂できないのか、そして何のためになるのかを決して知りません。

ただし、入力データがクリーンで、文字列がなく、ゼロではなく、数字だけであるとします。 print('YES')とすることができます。なぜなら、すべての数値は、他のすべての数値(0と+ INF/-INFを除く)と分数結果で割り切れるからです。

その場合、質問は奇妙です。しかし、質問が尋ねられるので、私はあなたが整数除算をしたいと思います。

整数除算のため、及び手元整数を使用すると、a % b(割り算の余り)はabによって割り切れるであることを意味し、ゼロであるかどうかを確認する必要があります

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 

このクラス可能&分母分子以上の整数の分数を「正規化」。 floatを含む任意の値を割り切れるには、分母は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、おそらくいくつかの精度を失うことを持っていることができます値。たとえば、カンマ(すなわち、1/1000000)の後に6桁に制限:

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

これは私が必要とするものです!どうもありがとうございます! – RBair

+0

@RBair私は&bのfloat値の答えを拡張しました。 –

+0

ありがとう!文字列について何かできることは可能でしょうか?私がリストに文字列を置くと、渡されるのではなく、%: 'int'と 'str'のためのサポートされていないオペランドの型が与えられます。 – RBair

1

これは、数値以外の値とゼロ分母をキャッチします。

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

当然ながら、numbersモジュールをインポートする必要があります。しかし、ifステートメントでは、浮動小数点のオーバーフローをキャッチすることは非常に困難です。

+0

これは機能しました。ありがとうございました! – RBair

0

また、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) 
関連する問題