Статья Автор: Александр Ф. Алейников

4.2 Логические операторы

Логические операторы

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

Можно заметить, что выражение a and b является истинным тогда и только тогда, когда все условия, объединённые логическим оператором and по отдельности являются истинными. 

Оператор or

После сдачи ЕГЭ у вас будет выбор, куда поступать. Допустим, в сумме вы набрали 250 баллов. Для обучения на бюджете вы рассматриваете направления, на которые проходной балл не превышает 250. Также вы рассматриваете платную форму обучения со стоимостью, не превышающей 200000 рублей в год. Давайте напишем программу, которая позволит нам отобрать подходящие направления:

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 b a or b
False False False
False True True
True False True
True True True

 

Можно заметить, что выражение 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('Не подходит)

Данная программа отбирает такие вузы, в которые либо проходной балл меньше или равен 250, либо вузы, стоимость обучения в которых не превышает 200000 рублей, притом во втором случае вуз должен находиться либо на расстоянии, не превышающем 10 километров, либо в Москве. 

Обратите внимание, что сейчас порядок выполнения условий задан скобками. В конце урока мы поговорим о приоритете логических операций.

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

a not a
False True
True False

Таким образом, оператор not ложное выражение делает истинным, а истинное — ложным.

Приоритеты логических операций

Если в выражении используются несколько логических операторов, то приоритет следующий:

  1. Сначала выполняется логическое отрицание not
  2. Затем логическое умножение and
  3. И в конце логическое сложение or

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

Цепочки сравнений

При написании условий часто удобно использовать цепочки сравнений. Рассмотрим следующую программу:

a = int(input())
if 100 <= a < 1000:
    print('Положительное трёхзначное число')

В данной программе мы считываем одно число и если оно находится в диапазоне от 100 (включительно) до 1000 (не включительно), то выводим соответствующий текст на экран.

На самом деле такой код полностью эквивалентен коду:

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('Не все числа различны')

На самом деле данная программа будет работать неверно. Например, при вводе  чисел 523 и 5 программа будет выдавать, что все числа различны, хотя это таковым не является. Давайте перепишем эту программу с явным использованием оператора 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.

Печать