2016-08-29 10 views
0

のため、私はこのコードを入力すると、プログラムは私が非番号を入力した場合でも、エラーをスローすることはありません:Pythonの条件

user_input = input("Enter a number.") 
if user_input.isdigit() and 0 <= float(user_input) <= 10: 
    print("A number between 0 and 10.") 
else: 
    print("Not a number between 0 and 10.") 

しかし、私はこのコードを入力すると、プログラムは次の場合にエラーがスローされます私は非番号を入力します:

user_input = input("Enter a number.") 
if 0 <= float(user_input) <= 10 and user_input.isdigit(): 
    print("A number between 0 and 10.") 
else: 
    print("Not a number between 0 and 10.") 

なぜ誰が知っていますか?それは本当に条件をタイプする順番に違いがありますか?

+2

明らかに、実際には違いがあります。 –

+0

エラーメッセージを読むと、その理由を説明するのに役立つかもしれません。 –

+0

最初の例を試したところ、 "a"と入力するとエラーが表示されます – imreal

答えて

2

もちろん、重要です。

if 0 <= float(user_input) <= 10 and user_input.isdigit(): 

まずfloat(user_input)を評価しようとします。 user_inputが数字以外の文字列の場合はValueErrorとなります。


if user_input.isdigit() and 0 <= float(user_input) <= 10: 

まずuser_input.isdigit()を評価しようとします。 Falseを返した場合、0 <= float(user_input) <= 10はまったく評価されません。

この現象は「短絡」と呼ばれます。 述語A AND Bでは、ATrueの場合にのみBが評価されます。 同様に、述語A OR Bでは、AFalseの場合にのみBが評価されます。

+0

興味深い。私はいつもコンピュータがあらゆるブールステートメントのすべての条件をチェックしたと思っていました。だから、単に優先順位をつけるだけでプログラムの効率を改善することは可能ですか? @ NeilA。 –

+0

まったく。 – DeepSpace

0

最初のケースでは、isdigit()メソッドはfalseであるため、次の条件はチェックされません。 2番目のケースでは、float()が試行され、発生します。例外:

... float('bob') 
Traceback (most recent call last): 
    File "<stdin>", line 2, in <module> 
ValueError: could not convert string to float: bob 
>>>