2016-03-22 2 views
0

Проблема «Учитывая 2 ints, a и b, возвращает True, если один из них равен 10, или если их сумма равна 10."Использование «или» при оценке целых чисел

В первом тесте, почему ввод (9,9) и (8,3) возвращает True?

С тех пор я решил проблему, используя другое решение (далее ниже), но я стараюсь понять, почему первое решение не работает, поскольку ни одно целое не равно 10, ни они не равны 10 при суммировании!

Благодарим за помощь.

def makes10(a, b):           

    if a or b == 10: 
     return True 

    if a + b == 10: 
     return True 

    else: 
     return False 

def makes10(a, b): 

    if a == 10: 
     return True 

    if b == 10: 
     return True 

    if a + b == 10: 
     return True 

    else: 
     return False 
+3

'a or b == 10' означает' (a! = 0) или (b == 10) '. Конструкция, которую вы хотели, - 'a == 10 или b == 10'. Достаточно ли вам понять свою ошибку? – zwol

+0

Дубликат [this] (http://stackoverflow.com/questions/15112125/how-do-i-test-one-variable-against-multiple-values) – timgeb

+0

А, да. @timgeb: это намного лучший дубликат, чем тот, который я выбрал. Вариации этого вопроса задавались так много раз. Благодаря! –

ответ

3

В нем указано a or b == 10, так как a истинно, то есть нет нуля, оно возвращает true.

1

Поскольку это:

if a or b == 10: 

выполняется как эквивалент

temp = (a or b) 
if (temp == 10): 

вы можете НЕ тест несколько значений против одного фиксированного значения, как это. Вы должны тестировать каждый отдельно, например. если у вас было

if (a == 10) or (b == 10): 

заявление сработало бы. Прочитайте документацию: https://docs.python.org/3/reference/expressions.html#operator-precedence

+2

Я думаю, что 'a' оценивается как True и 'b' не оценивается. –

+0

есть. но 'или' все еще имеет более высокий приоритет, чем '==', поэтому вы тестируете результат 'или' против '10', а не отдельные значения' a' или 'b'. –

1
a or b == 10 

Это вычисляется Правда, как a оценивает Истинных

Вы должны написать

(a == 10) or (b == 10) 
1
if a or b == 10: 

Это не делать то, что вы думаете, что он делает. Это будет оцениваться как:

if (a) or (b == 10): 

Вы, скорее всего хотите:

if a == 10 or b == 10: 
+0

Таким образом, любое число, отличное от «0», вернет True, если вы написали: if a: ... –

+0

@GavMac Да. Правильно. Посмотрите термины «правдивые» и «ложные». – Carcigenicate

+0

Спасибо Carcigenicate! –

1
a or b == 10 

Это будет первым оценивать в контексте логического выражения, и если это верно, то все выражение просто, правда. Если оно ложно, то оно будет оценивать b == 10. Он отличается от a == 10 or b == 10.

В качестве альтернативы, вы бы просто сказать

if 10 in [a, b]: 

это также будет делать то, что вы хотите достичь.

Смежные вопросы