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

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

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

Как быть в ситуации, когда у нас есть несколько условий? В Python есть три логических оператора, которые позволяют создавать сложные условия:

  • and — логическое умножение;
  • or — логическое сложение;
  • not — логическое отрицание.

Оператор and

Предположим, мы написали программу для учеников от двенадцати лет, которые учатся по крайней мере в 7 классе. Доступ к ней тем, кто младше, надо запретить. Следующий код решает поставленную задачу:

age = int(input('Сколько вам лет?: '))
grade = int(input('В каком классе вы учитесь?: '))
if age >= 12 and grade >= 7:
    print('Доступ разрешен.')
else:
    print('Доступ запрещен.')

Мы объединили два условия при помощи оператора and. Он означает, что в этом ветвлении блок кода выполняется только при выполнении обоих условий одновременно!

Оператор and может объединять произвольное количество условий:

age = int(input('Сколько вам лет?: '))
grade = int(input('В каком классе вы учитесь?: '))
city = input('В каком городе вы живете?: ')
if age >= 12 and grade >= 7 and city == 'Москва':
    print('Доступ разрешен.')
else:
    print('Доступ запрещен.')

Это таблица истинности для оператора and. В ней перечислены выражения, соединённые оператором and, показаны все возможные комбинации истинности и ложности и приведены результирующие значения выражений.

a b a and b
False False False
False True False
True False False
True True True

Как показывает таблица, чтобы значение выражения с оператором and было истинным, должны быть истинными оба (все) объединенные им условия.

Оператор or

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

city = input('В каком городе вы живете?: ')
if city == 'Москва' or city == 'Санкт-Петербург' or city == 'Екатеринбург':
    print('Доступ разрешен.')
else:
    print('Доступ запрещен.')

Доступ будет разрешен в случае, если хотя бы одно из условий выполнится.

Это таблица истинности для оператора or. В ней перечислены выражения, соединённые оператором or, показаны все возможные комбинации истинности и ложности и приведены результирующие значения выражений.

a b a or b
False False False
False True True
True False True
True True True

Для того, чтобы выражение or было истинным, требуется, чтобы хотя бы одно условие оператора or было истинным. При этом не имеет значения, истинным или ложным является второе выражение.

Логическое выражение X and Y истинно, если оба значения X и Y истинны.

Логическое выражение X or Y истинно, если хотя бы одно из значений X и Y истинно.

Мы можем использовать оба логических оператора одновременно:

age = int(input('Сколько вам лет?: '))
grade = int(input('В каком классе вы учитесь?: '))
city = input('В каком городе вы живете?: ')
if age >= 12 and grade >= 7 and (city == 'Москва' or city == 'Санкт-Петербург'):
    print('Доступ разрешен.')
else:
    print('Доступ запрещен.')

Такой код проверяет, что возраст учеников от двенадцати лет и учатся они по крайней мере в 7 классе и живут в Москве или Санкт-Петербурге.

Оператор not

Оператор not позволяет инвертировать (т.е. заменить на противоположный) результат логического выражения. Например, следующий код:

age = int(input('Сколько вам лет?: '))
if not (age < 12):
    print('Доступ разрешен.')
else:
    print('Доступ запрещен.')

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

age = int(input('Сколько вам лет?: '))
if age >= 12:
    print('Доступ разрешен.')
else:
    print('Доступ запрещен.')

В первом примере мы поместили выражение age < 12 в скобки для того, чтобы было чётко видно, что мы применяем оператор not к значению выражения age < 12, а не только к переменной age.

Таблица истинности для оператора not:

a not a
False True
True False

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

Логические операторы, подобно арифметическим операторам (+, -, *, /), имеют приоритет выполнения. Приоритет выполнения следующий:

  • в первую очередь выполняется логическое отрицание not;
  • далее выполняется логическое умножение and;
  • далее выполняется логическое сложение or.

Для явного указания порядка выполнения условных операторов используют скобки.

Примечания

Примечание 1. Частой ошибкой у начинающих программистов является путаница логических операторов and и or. Рассмотрим два условия:

if x > 1 and x < 100:
if x > 1 or x < 100:

Верным является только первое условие. В нём проверяется, что число x находится в диапазоне от 1 до 100, другими словами, x(1;100). Второе условие проверяет, что число x или больше 1, или меньше 100. Однако такому условию удовлетворяет любое число!

Примечание 2. Другую частую ошибку видим в следующем примере кода:

if age >= 7 and <= 9:

Запуск такого кода приведет к появлению ошибки во время выполнения программы. Необходимо явно записывать условия:

if age >= 7 and age <= 9:

Примечание 3. Не забывайте, что в Python есть удобный способ для проверки принадлежности диапазону. Например, следующий код:

if age >= 7 and age <= 9:

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

if 7 <= age <= 9:

Последний код предпочтительнее.

Примечание 4. Оба оператора, and и or, вычисляются по укороченной схеме.

Вот как это работает с оператором and. Если условие слева от оператора and является ложным, то условие справа от него не проверяется, так как результат выражения будет гарантированно ложным и проверка оставшегося условия — пустая трата процессорного времени.

Например, в таком выражении:

5 > 100 and 10 > 0

вычисляется только выражение 5 > 100. Оно ложно (потому что 5 не может быть больше 100). При операторе and оба выражения должны быть правдивы, чтобы результат был True. Но у нас уже одно не правдиво, значит, результат и так будет False. Поэтому нам и не надо вычислять второе выражение, оно всё равно не повлияет на результат.

Аналогично работает оператор or. Если условие слева от оператора or истинное, то условие справа от него не проверяется. Действительно, результат будет гарантированно истинным и проверка оставшегося условия станет пустой тратой процессорного времени.

Например, в таком выражении:

10 > 0 or 5 > 100

вычисляется только выражение 10 > 0. Оно правдиво, значит результат тоже правдив, т.к. нам достаточно одного правдивого выражения при операторе or.

Пропустить Навигационные Ссылки.
Чтобы оставить комментарий нужна авторизация
Печать