Логические операторы
В предыдущем уроке мы узнали, как задавать логику работы программы таким образом, чтобы выполнять только блоки кода, соответствующие заданному условию. Но что делать, если условий несколько? В 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
.