Оценка числовых выражений - PullRequest
3 голосов
/ 20 ноября 2011

Может кто-нибудь объяснить мне, почему при вычислении числовых выражений Python в результате вычисления возвращает последнюю оцененную вещь?

Например:

3 and 5

оценивается как

5

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

3 == True

Я получаю False, но когда я оцениваю:

3 and 5

и получить 5 в результате, он, очевидно, (я думаю) думает, что 3 оценивается как Истина, так как он не будет продолжать оценивать, если думает иначе (я могу ошибаться здесь).Напротив, когда я оцениваю:

0 and 3

Я получаю 0, и я думаю, что происходит то, что Python проверяет, является ли 0 Истиной, решает, что это не так, и выплевывает.

Яизвините, если все это звучит немного хаотично, но я наткнулся на это в своей книге и мне было любопытно, есть ли что-то, что я пропускаю.

Ответы [ 3 ]

3 голосов
/ 20 ноября 2011

Да, в python любое значение является либо правдивым, либо ложным.Каждое целое является правдивым, кроме 0. С булевыми операторами or и and python возвращает последнее выражение, которое он вычисляет, например, 3 or 5 вернет 3, так как python впервые увидит, что 3 верно и не должно вычислять5 и возвращает 3.

В 0 и 5 0 является ошибкой, поэтому python не оценивает следующее выражение и возвращает 0.

Причина 5 == True дает False как 5не равно истине, он просто действует правдиво в логических выражениях.bool(5) == True дает True, поскольку это явно преобразует целое число в логическое значение.

2 голосов
/ 20 ноября 2011

Из Python Reference:

The expression x and y first evaluates x; if x is false, its value is returned;
otherwise, y is evaluated and the resulting value is returned.

Если бы вы сказали

0 and 5

, было бы возвращено значение первой оцененной вещи (0).

По второму вопросу 3, очевидно, оценивается как true, когда рассматривается как логическое значение, но оператор == не приводит свои аргументы к логическому значению до сравнения.

0 голосов
/ 20 ноября 2011

Как работают логические операции

См. документацию по логическим операциям . Они работают следующим образом:

  • a or b возвращает первый элемент, который оценивается как True, поэтому в случае 0 or 3 это будет 3, а в случае 3 or 5 также будет 3,
  • a and b возвращает первый элемент, оцененный как False, в противном случае (если все элементы оценены как True), возвращается последний элемент, поэтому 0 and 3 станет 0 и 3 and 5 стало 5,

Решение

Но есть решение вашей проблемы. Просто приведите результат в логическое значение, используя bool():

>>> bool(0 or 3)
True
>>> bool(3 or 5)
True
>>> bool(0 and 3)
False
>>> bool(3 and 5)
True

Помогло ли это?

EDIT:

Другое решение

На самом деле я думаю, что в вашем случае может быть даже лучшее решение вашей проблемы. Смотрите это:

  • bool(a or b) можно заменить на any([a, b]) и
  • bool(a and b) можно заменить на all([a, b]),

и теперь я считаю, что это более разумное решение.

...