2015-01-30 6 views
1

В этом семестре я изучаю вводный курс по Python в этом семестре (с использованием 3.4) и недавно наткнулся на упражнение о приоритете оператора и с помощью круглых скобок, чтобы сделать утверждение оценено как true.Оценка операторов сравнения в Python, которые ведут себя неожиданно

Точный вопрос:

Add a single pair of parentheses to the expression so that it evaluates to true. 
1 < -1 == 3 > 4 

Я предположил, что правильный ответ был бы:

1 < -1 == (3 > 4) 

Учитывая, что операторы сравнения все на том же уровне приоритета, они должны оценить из слева направо, поэтому он должен оцениваться как таковой:

1 < -1 == (3 > 4) 
1 < -1 == False 
False == False 
True 

Но когда я говорю n код все еще возвращает false. Я видел этот вопрос comparison operators' priority in Python vs C/C++, и результат этого выражения имеет смысл для меня; но в этом случае я заставил оценить последнее утверждение перед оценкой остальной части выражения, поэтому я не понимаю, почему я все еще получаю неправильный ответ.

Я смотрел на него в течение прошедшего часа, и мне кажется, что я мог бы пропустить что-то очевидное; если кто-то мог бы дать некоторое представление о том, какое правильное решение может быть, это было бы весьма полезно.

+1

Вы понимаете часть этого ответа о сравнении * chaining *? В этом ответе объясняется, как последовательности операторов сравнения не работают в соответствии с простым «порядком приоритета», но привязаны к нескольким сравнениям с «и». – BrenBarn

+0

@BrenBarn Я думал, что понял, но я думаю, что я не получу никаких последствий. Я попробую написать его с цепочкой и посмотреть, смогу ли я лучше понять, где я ошибаюсь. –

+0

@BrenBarn Итак, вычисляемый фактический оператор равен 1 <-1 и -1 == (3> 4), что приводит к окончательной оценке False и False, что приводит к False. Мне нужно поиграть с ним еще немного, я думаю. Спасибо за помощь! –

ответ

2

Задача представляется невозможной. Рассмотрим эти три случая:

  1. Существует открытая скобка непосредственно перед -1.

  2. Под открытым небом находится - и 1.

  3. Существует открытый паз где-нибудь еще.

Эти три случая представляют собой все возможные места для круглых скобок.

В первом случае у нас есть 1 < (...), где многоточие является булевым выражением. Поскольку 1 не менее True или False, все выражение равно False.

Во втором случае у нас есть 1 < -(...), где многоточие является булевым выражением. Так как 1 не менее -True или -False, все выражение равно False.

В третьем случае у нас есть 1 < -1 == .... Так как все ноги выражения цепочки операторов должны быть истинными, а так как 1 < -1 False, все выражение равно False.

Таким образом, в каждом возможном случае результатом является False.

+0

Это отличный способ приблизиться к нему; намного лучше, чем вручную добавлять круглые скобки и проверять каждое решение (хотя DSM сделал гораздо более умный способ его автоматизации). Принимая это как правильный ответ, так как он напрямую отвечает на мой вопрос. –

+0

Справедливости ради, вы действительно не задавали вопрос, так что трудно сказать, кто на него ответил, а кто нет. –

+0

Ну, в конце я спросил, что является правильным ответом, и правильный ответ заключается в том, что его нет. –

1

Вы на правильном пути, но из-за сравнения СЦЕПЛЕНИЕ вы будете иметь:

1 < -1 == (3 > 4) 
1 < -1 == False 
1 < -1 and -1 == False 
False and False 
False 

Обратите внимание, что мы не оценить вторую линию слева направо, а мы приковать двух сравнений вместе с а также.

Есть только несколько действительных способов добавить одну пару скобок в этом, чтобы мы могли проверить все остальное легко:

(1 < -1 == 3 > 4) 
False #Trivially 

(1 < -1) == 3 > 4 
False == 3 > 4 
False == 3 and 3 > 4 
False and False 
False 

1 < (-1 == 3) > 4 
1 <False> 4 
1 < False and False > 4 
False and False 
False 

Похоже, что нет ответа на этот вопрос!

Редактировать:

Огонь! Роб указывает, что мы забыли:

1 < -(1 == 3) > 4 
1 < -False > 4 
1 <0> 4 
1 < 0 and 0 > 4 
False and False 
False 
+0

Да, это тот вывод, который я пришел после прочтения комментария БренБарна; Думаю, мне нужно продолжать работать над этим. –

+0

Хорошо, я вижу, вы, ребята, пришли к такому же выводу! – Imran

+0

Вы пропустили '1 < -(1 == 3) > 4' в своем анализе. –

1

3>4 дает False. -1 == FalseFalse. 1 < FalseFalse. Следовательно, 1 < -1 == 3 > 4 становится False.

Дайте правильные скобки, чтобы сделать утверждение семантически правильным.

(1 < -1) == (3 > 4) 
+0

Это решение, на которое я смотрел, но идея состоит в том, чтобы использовать только одну пару круглых скобок. Я не знаю, было ли в учебнике просто неправильно. –

+1

@TerryChern Я предполагаю, что учебник был написан для другого языка и преобразован в python (или, по крайней мере, автор был более знаком с чем-то вроде C). Поведение Python в цепных сравнениях очень необычно (и только спорадически полезно). – sapi

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