Логические операторы
В предыдущем уроке мы узнали, как задавать логику работы программы таким образом, чтобы выполнять только блоки кода, соответствующие заданному условию. Но что делать, если условий несколько? В Python для этого существуют логические операторы, которые позволяют создавать сложные условия. Под «сложными» подразумеваются условия, состоящие из нескольких простых.
Всего в языке Python существуют три логических оператора:
and — логическое умножение (читается как «И»)
or — логическое сложение (читается как «ИЛИ»)
not — логическое отрицание (читается как «НЕ»)
Оператор and
Допустим, вы захотели приобрести новенький айфон. Для себя вы решили, что хотите телефон 15-ой версии или новее стоимостью не более 150000 рублей. Для этого вы зашли на популярный сайт техники SND. Давайте напишем программу, которая поможет нам с выбором:
model = int(input('Укажите модель айфона'))
cost = int(input('Укажите стоимость телефона'))
if model >= 15 and cost <= 150000:
print('Покупаем')
else:
print('Смотрим дальше')
В данной программе мы объединили два простых условия model >= 15 и cost <= 150000 с помощью логического оператора and. Этот оператор означает, что блок кода выполнится только в том случае, если выполнятся оба условия одновременно.
Рассмотрим таблицу истинности для логического оператора and. В этой таблице перечислены значения выражения a and b при всех возможных комбинациях значений a и b
Можно заметить, что выражение a and b является истинным тогда и только тогда, когда все условия, объединённые логическим оператором and по отдельности являются истинными.
Оператор or
После сдачи ЕГЭ у вас будет выбор, куда поступать. Допустим, в сумме вы набрали баллов. Для обучения на бюджете вы рассматриваете направления, на которые проходной балл не превышает . Также вы рассматриваете платную форму обучения со стоимостью, не превышающей рублей в год. Давайте напишем программу, которая позволит нам отобрать подходящие направления:
passing_score = int(input('Введите проходной балл в вуз'))
cost_education = int(input('Введите стоимость обучения в вузе'))
if passing_score <= 250 or cost_education <= 200000:
print('Направление подходит')
else:
print('Направление не подходит')
В данной программе мы объединили два простых условия passing_score <= 250 и cost_education <= 200000 с помощью логического оператора or. Этот оператор означает, что блок кода выполнится только в том случае, если выполнится хотя бы одно условие из указанных.
Рассмотрим таблицу истинности для логического оператора or. В этой таблице перечислены значения выражения a or b при всех возможных комбинациях значений a и b
Можно заметить, что выражение a or b является истинным всегда, кроме случая, когда оба условия ложны.
Условия, объединённые логическими операторами or и and могут входить в условие if вместе и в любом количестве.
Рассмотрим следующую программу:
passing_score = int(input('Введите проходной балл'))
cost_education = int(input('Введите стоимость обучения'))
distance = int(input('Введите расстояние до вуза'))
city = input('Введите город, в котором находится вуз')
if passing_score <= 250 or ((distance <= 10 or city == 'Москва') and cost_education <= 200000):
print('Подходит')
else:
print('Не подходит)
Данная программа отбирает такие вузы, в которые либо проходной балл меньше или равен , либо вузы, стоимость обучения в которых не превышает рублей, притом во втором случае вуз должен находиться либо на расстоянии, не превышающем километров, либо в Москве.
Обратите внимание, что сейчас порядок выполнения условий задан скобками. В конце урока мы поговорим о приоритете логических операций.
Оператор not
Оператор not позволяет инвертировать (заменять на противоположный) результат выполнения логического выражения.
Рассмотрим пример:
a = int(input('Введите любое число'))
if not(a > 33):
print('a меньше или равен 33')
else:
print('a больше 33')
Такой код полностью эквивалентен коду:
a = int(input('Введите любое число'))
if a <= 33:
print('a меньше или равен 33')
else:
print('a больше 33')
Условие a > 33 было взято в скобки в первом примере, чтобы показать, что оператор not применяется ко всему выражению целиком, а не только к a.
Рассмотрим таблицу истинности для логического оператора not. В этой таблице перечислены значения выражения not a при всех возможных комбинациях значениях a
Таким образом, оператор not ложное выражение делает истинным, а истинное — ложным.
Приоритеты логических операций
Если в выражении используются несколько логических операторов, то приоритет следующий:
- Сначала выполняется логическое отрицание
not
- Затем логическое умножение
and
- И в конце логическое сложение
or
Если мы хотим поменять порядок выполнения, то, как и с математическими операторами, можно использовать скобки.
Цепочки сравнений
При написании условий часто удобно использовать цепочки сравнений. Рассмотрим следующую программу:
a = int(input())
if 100 <= a < 1000:
print('Положительное трёхзначное число')
В данной программе мы считываем одно число и если оно находится в диапазоне от (включительно) до (не включительно), то выводим соответствующий текст на экран.
На самом деле такой код полностью эквивалентен коду:
a = int(input())
if 100 <= a and a < 1000:
print('Положительное трёхзначное число')
То есть цепочки сравнений — это неявное использование логического оператора and.
Давайте представим, что у нас есть три числа, и мы хотим вывести на экран текст «Все числа различны», если ни одно число не совпадает с другим. И текст «Не все числа различны» в противном случае. Рассмотрим ещё одну программу, отражающую частую ошибку в логике начинающего программиста:
a = int(input())
b = int(input())
c = int(input())
if a != b != c:
print('Все числа различны')
else:
print('Не все числа различны')
На самом деле данная программа будет работать неверно. Например, при вводе чисел , и программа будет выдавать, что все числа различны, хотя это таковым не является. Давайте перепишем эту программу с явным использованием оператора and :
a = int(input())
b = int(input())
c = int(input())
if a != b and b != c:
print('Все числа различны')
else:
print('Не все числа различны')
Тут становится понятно, в чём заключается ошибка. В выражении a != b мы действительно проверяем, что первое число не равно второму. В выражении b != c проверяем, что второе число не равно третьему. Но не проверяем, что первое число не равно третьему.
Один из вариантов правильного кода будет выглядеть следующим образом:
a = int(input())
b = int(input())
c = int(input())
if a != b and b != c and a != c:
print('Все числа различны')
else:
print('Не все числа различны')
Ещё немножко про приоритеты
В процессе изучения урока вполне закономерно мог возникнуть вопрос: «А в каком порядке будут выполняться действия в условии, если в нём есть и знаки математических операций, и знаки сравнения, и логические операторы?».
На самом деле в языке Python, впрочем, как и в любом другом языке программирования, чётко установлен приоритет выполнения тех или иных операций и операторов:
- Сначала выполняются арифметические операции
- Далее выполняются операторы сравнения
- Затем логические операторы
Рассмотрим следующую программу:
a = int(input())
b = int(input())
c = int(input())
if a + b > c or a * b > 0:
print("Поговорим о приоритетах")
Таким образом, в данной программе сначала произойдет сравнение суммы a и b со значением c и произведение a и b с 0, а затем полученные результаты (каждый из которых равен True либо False) объединятся логическим оператором or.