Найти - Пользователи
Полная версия: Вопрос
Начало » Центр помощи » Вопрос
1
Pam_pam
Вопрос в том, почему если я пишу 5 == 1 or 2 (5 же вроде не равно 1 или 2, втф) оно считает что это верно?
 >>> if 5 == 1 or 2:
	s = 2 + 4
	
>>> print(s)
6
>>> 
FishHook
Потому что есть такое понятие старшинство операции, и вам с этим понятием необходимо ознакомиться
4kpt_IV
Эммм…

 #
print(5 == 3 or 3)
print(bool(5 == 3 or 3))
_nemo_
 # Оператор if тип 1. Работает корректно
s = 1
if 5 == 1 or 5 == 2:
	s = 2 + 4
print(s)
# Оператор if тип 2. Работает не корректно в данном контексте
s1 = 1
if 5 == 1 or 2:
	s1 = 2 + 4
print(s1)
Romissevd
_nemo_
 # Оператор if тип 2. Работает не корректно в данном контексте
s1 = 1
if 5 == 1 or 2:
	s1 = 2 + 4
print(s1)
Оператор работает корректно т.к. 5 == 1 - False, а любое число не равное 0 будет - True. False or True будет True.
P.S. В данном случае не будет сравнения 5 сперва с 1, а потом с 2.
greeblie
Раз уж вы так настойчиво спрашиваете, почему.
Задумайтесь, какие преобразования происходят при вычислении
 bool(5 == 1 or 2)
Для начала, оператор == имеет больший приоритет, чем or, поэтому выражение в скобках эквивалентно
 (5 == 1) or 2
Итак, сначала вычисляется первая скобка
 >>>5 == 1
False
Затем выражение сводится к
 >>>False or 2
Тут надо заметить, что, если бы слева оказалось не False, а True, то правая часть никогда бы не вычислялась, поскольку
 True or _что_угодно_
всегда равно True. На этом основан часто использующийся приём в программировании, когда в правую часть конъюнкции ставят вызов функции, который должен производиться только в случае истинности левой части (по аналогии, дальнейшее вычисление a and b and c and d and… не имеет смысла, как только встречается хотя бы один False). Например:
 >>>if is_in_bounds(x, y) and is_empty(x, y):
 >>>    draw_dot(x, y)
При желании, можно придумать пример и с or.
В данном же случае происходит
 >>>bool(2)
 True
 >>>False or True
 True
На заметку:
 >>>True == 1
 True
 >>>False == 0
 True
 >>>5 + True
 6
 >>>False - True
 -1
Но это уже особенность питона и нескольких других языков.
А так, всё это - самые основы.
Подумайте ещё, что будет, если написать
 >>>5 == (1 or 2)
И почему
 >>>5 == 1 or 5 == 2
- единственный правильный вариант сделать то, что вы хотите.
_nemo_
Romissevd
Оператор работает корректно т.к. 5 == 1 - False, а любое число не равное 0 будет - True. False or True будет True.
P.S. В данном случае не будет сравнения 5 сперва с 1, а потом с 2.

Полностью согласен с вами уважаемый Romissevd.
Оператор if работает корректно,
но вот в данном контексте исользован не совсем корректно
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB