Не понятен принцип срабатывания условного оператора if
Пытаюсь проверить, какое значение из словаря cash соответствует ключу 'op':
cash = {'x': 0,
'y': 0,
'eq': 0,
'op': '-'}
if cash['op'] == '+' or '+=':
print('plus', cash)
elif cash['op'] == '-' or '-=':
print('minus', cash)
elif cash['op'] == '*' or '*=':
print('mult', cash)
elif cash['op'] == '/' or '/=':
print('div', cash)
else:
print('WTF?')
Получаю: plus {'x': 0, 'y': 0, 'eq': 0, 'op': '-'}
Несмотря на то, что значение 'op' : '-', почему-то срабатывает условие if cash['op'] == '+' or '+='.
Как исправить код так, чтобы проверка значения ключа 'op' работало корректно?
Ответы (2 шт):
Уже давал недавно ответ на подобный вопрос.
Дело в том, что вы неправильно реализуете сравнение.
Операция if cash['op'] == '+' or '+=': равносильна if (cash['op'] == '+') or ('+='):, и если левый операнд or изменяет своё значение, то правый - непустая строка, а булево представление непустых строк всегда истинно.
Получается операция if [True/False] or True, что всегда равно True.
Если вам нужно сравнивать значение сразу со многими, воспользуйтесь оператором вхождения in:
cash = {'x': 0,
'y': 0,
'eq': 0,
'op': '-'}
if cash['op'] in ('+', '+='):
print('plus', cash)
elif cash['op'] in ('-', '-='):
print('minus', cash)
elif cash['op'] in ('*', '*='):
print('mult', cash)
elif cash['op'] in ('/', '/='):
print('div', cash)
else:
print('WTF?')