Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 4, 2017 13:22:11

Pam_pam
Зарегистрирован: 2016-11-17
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос

Вопрос в том, почему если я пишу 5 == 1 or 2 (5 же вроде не равно 1 или 2, втф) оно считает что это верно?

 >>> if 5 == 1 or 2:
	s = 2 + 4
	
>>> print(s)
6
>>> 

Отредактировано Pam_pam (Янв. 4, 2017 13:24:43)

Офлайн

#2 Янв. 4, 2017 13:32:57

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Вопрос

Потому что есть такое понятие старшинство операции, и вам с этим понятием необходимо ознакомиться



Офлайн

#3 Янв. 4, 2017 13:33:49

4kpt_IV
Зарегистрирован: 2016-01-08
Сообщения: 999
Репутация: +  49  -
Профиль   Отправить e-mail  

Вопрос

Эммм…

 #
print(5 == 3 or 3)
print(bool(5 == 3 or 3))

Отредактировано 4kpt_IV (Янв. 4, 2017 13:34:05)

Офлайн

#4 Янв. 5, 2017 15:10:30

_nemo_
Зарегистрирован: 2017-01-02
Сообщения: 34
Репутация: +  1  -
Профиль   Отправить e-mail  

Вопрос

 # Оператор 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)

Отредактировано _nemo_ (Янв. 5, 2017 15:15:56)

Офлайн

#5 Янв. 5, 2017 16:30:20

Romissevd
От: Счастье
Зарегистрирован: 2015-03-01
Сообщения: 533
Репутация: +  76  -
Профиль   Отправить e-mail  

Вопрос

_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.

Офлайн

#6 Янв. 5, 2017 16:47:55

greeblie
Зарегистрирован: 2017-01-04
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос

Раз уж вы так настойчиво спрашиваете, почему.
Задумайтесь, какие преобразования происходят при вычислении

 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
- единственный правильный вариант сделать то, что вы хотите.

Отредактировано greeblie (Янв. 5, 2017 16:50:51)

Офлайн

#7 Янв. 5, 2017 17:07:18

_nemo_
Зарегистрирован: 2017-01-02
Сообщения: 34
Репутация: +  1  -
Профиль   Отправить e-mail  

Вопрос

Romissevd
Оператор работает корректно т.к. 5 == 1 - False, а любое число не равное 0 будет - True. False or True будет True.
P.S. В данном случае не будет сравнения 5 сперва с 1, а потом с 2.

Полностью согласен с вами уважаемый Romissevd.
Оператор if работает корректно,
но вот в данном контексте исользован не совсем корректно

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version