Логические выражения и операторы
Логическими выражениями называют утверждения, которые могут быть оценены как истинные (англ.
True
) или ложные (англ. False
). Например, выражение «Идёт дождь» в зависимости от погоды будет истинным или ложным. Так и в Python результатом вычисления любого логического выражения всегда будет значение логического типа данных: True
или False
.

Логический тип данных также называют булевым типом в честь британского математика и философа Джорджа Буля. Именно он в середине 19 века предложил систему рассуждений, где каждое высказывается либо истинное, либо ложное, что легло в основу булевой алгебры.
Именно благодаря работе Буля современные компьютеры обрабатывают данные, основываясь на простейших двоичных состояниях: 1 и 0, соответствующих логическим понятиям истинности ложности.
Логические выражения в сочетании с ветвлением являются фундаментальным инструментом в программировании, позволяя выполнять различные действия в зависимости от того, выполняются ли определенные условия. С их помощью можно реализовать проверку пароля, фильтрацию данных или управление потоком выполнения программы.
Логические значения объектов
Любой объект в Python обладает определенным логическим значением, которое можно получить с помощью встроенной функции bool()
.
Функция | bool(obj) |
Описание | Возвращает начальный индекс первого вхождения подстроки sub в строку str |
Параметры | obj – объект, логическое значение которого необходимо определить. |
Возвращаемое значение | True или False |
Функция bool()
возвращает True
, если объект считается истинным, и False
, если объект считается ложным.
К истинным значениям относятся любые непустые объекты и ненулевые числа:
print(bool("В саду распустились розы"))
# Вывод: True
print(bool({"name": "Копатыч", "location": "Долина Смешариков"}))
# Вывод: True
print(bool(256))
# Вывод: True
К ложным значениям относятся любые пустые объекты, число 0
любого типа и значение None
:
print(bool(""))
# Вывод: False
print(bool(0.0))
# Вывод: False
print(bool(None))
# Вывод: False
Связь с типом целых чисел
Булевы значения True
и False
тесно связаны с целым типом данных (int
): True
соответствует числу
, а 1
False
– числу 0
.
Преобразовать булевы значений в целые числа позволяет функция int()
:
print(int(True))
# Вывод: 1
print(int(False))
# Вывод: 0
Эта особенность может применяется в арифметических операциях, хотя это не является распространенной практикой.
Операторы сравнения
Для проверки отношения между объектами используются операторы сравнения. Их цель – сравнение содержимого объектов, чтобы определить отношение между двумя величинами. Результатом сравнения всегда является булево значение, указывающее на истинность или ложность выражения.
Оператор | Название | Описание | Пример | Результат |
---|---|---|---|---|
> |
Больше | Если левый операнд больше правого, возвращает True , иначе – False |
4 > 76 23 > 54 |
True False |
>= |
Больше или равно | Если левый операнд больше или равен правому, возвращает True , иначе – False |
14 >= 14 22 >= 39 |
True False |
< |
Меньше | Если левый операнд меньше правого, возвращает True , иначе – False |
12 < 93 56 < 3 |
True False |
<= |
Меньше или равно | Если левый операнд меньше или равен правому, возвращает True , иначе – False |
45 <= 45 34 <= 19 |
True False |
== |
Равно | Если левый операнд равен правому, возвращает True , иначе – False |
73 == 73 34 == 12 |
True False |
!= |
Не равно | Если левый операнд не равен правому, возвращает True , иначе – False |
12 != 32 37 != 37 |
True False |
Сравнение чисел в Python работает точно так же, как и в обычной математике:
print(21 < 42)
# Вывод: True
print(12 <= 1)
# Вывод: False
print(14 == 17)
# Вывод: False
==
и оператор присваивания =
. Они выполняют совершенно разные задачи, и неправильное их применение приведёт к ошибкам.
Сравнение строк
Операторы сравнения могут применяться и к строкам. В этом случае строки сравниваются лексикографически (посимвольно) на основе их порядковых номеров в Юникоде. Сначала сравнивается первый символ каждой строки, затем второй и так далее. Строчные буквы считаются меньше прописных, а латинские символы больше кириллических.
Например, если сравнить строки, содержащие строчные английские буквы "a"
и
, то строка с буквой"b"
будет меньше:"a"
print("a" < "b")
# Вывод: True
Это связано с тем, что порядковый номер символа "a"
в Юникоде меньше, чем порядковый номер символа "b"
. Убедимся в этом, получив номера символов с помощью функции ord()
:
print(ord("a"))
# Вывод: 97
print(ord("b"))
# Вывод: 98
Так как 97 < 98
, то и "a" < "b"
.
Также при сравнении учитывается регистр букв: заглавная буква считается меньшей, чем строчная.
print("Груша" > "груша")
# Вывод: False
print("большой театр" >= "Большой театр")
# Вывод: True
Если символы совпадают, то больше будет так строка, у которой больше длина:
print("Гол" < "Голова")
# Вывод: True
print("Котёнок" > "Кот")
# Вывод: True
Поэтому строки равны только в том случае, если у них совпадают все символы и длина строки.
Операторы идентичности
В отличие от оператора сравнения на равенство ==
, который проверяет равенство значений, операторы идентичности is
и is not
проверяют указывают ли две переменные на один и тот же объект в памяти компьютера.
Оператор | Описание | Пример | Результат |
---|---|---|---|
is |
Если оба операнда ссылаются на один и тот же объект в памяти, возвращает True , иначе – False |
x is y |
True или False |
is not |
Если оба операнда ссылаются на разные объекты в памяти, возвращает True , иначе – False |
x is not y |
True или False |
На практике операторы is
и is not
чаще всего применяются при сравнении с None
для проверки на отсутствие значения, так как None
представляет собой уникальный объект, и любое другое значение гарантированно не совпадает с ним по ссылке:
amount = None
print(amount is None)
# Вывод: True
Операторы идентичности следует использовать с осторожностью при сравнении изменяемых объектов (таких как списки и словари), так как они проверяют равенство идентификаторов объектов, а не их содержимого.
Например, создадим две переменные целочисленного типа данных (неизменяемого) с одинаковым значением и увидим, что обе будут ссылаться на один объект в памяти компьютера:
number1 = 10
number2 = 10
print(number1 is number2)
# Вывод: True
Однако для каждого из списков (изменяемого типа данных), несмотря на одинаковое содержимое, будут созданы новые объекты:
fruits_1 = ["Яблоки", "Груши"]
fruits_2 = ["Яблоки", "Груши"]
print(fruits_1 is fruits_2)
# Вывод: False
Но если одной переменной присваивается значение другой, они будут ссылаться на один и тот же объект:
fruits_1 = ["Яблоки", "Груши"]
fruits_2 = fruits_1
print(fruits_1 is fruits_2)
# Вывод: True
Логические операторы
Логические операторы выполняют логические операции над простыми выражениями, объединяя их в единое сложное выражение. Основываясь на законах алгебры логики, в Python выделяют три основные логические операции: отрицание, конъюнкцию и дизъюнкцию.
Отрицание изменяет значение условия на противоположное, фактически являясь инверсией. В реальной жизни аналогичную роль играет частица «не». Предположим, вы заявляете друзьям в кафе: «Мы закажем пиццу с ананасами», но ваш приятель отрицает ваше высказывание: «Мы не закажем пиццу с ананасами».
Термины «конъюнкция» и «дизъюнкция» могут вызвать затруднения, поскольку заимствованы из латыни. Конъюнкция буквально означает «связывание», отражая требование выполнения всех заданных условий одновременно, поэтому её ассоциируют с союзом «и». Так, если кто-то заявит: «Мы закажем и пиццу с ананасами, и пиццу с грибами», то его высказывание будет истинным только, если будуи заказаны обе пиццы.
Что касается дизъюнкции, то её корень восходит к слову «разделять» и сама операция приближена к союзу «или». Она воплощает понятие альтернативы, подразумевая выбор одного или обоих из предлагаемых вариантов. Подобно ситуации, когда кто-то скажет: «Мы закажем или пиццу с грибами, или пиццу с курицей», и он будет прав как в случае заказа одной из перечисленных пицц, так и сразу обеих.
В традиционной булевой алгебре логические операции аналогичны арифметическим действиям, поэтому конъюнкцию также называют логическим умножением, а дизъюнкцию – логическим сложением.
В Python рассмотренные логические операции реализуются тремя основными операторами: not
(с англ. – не), and
(с англ. – и) и or
(с англ. – или). Первый реализует отрицание, второй – конъюнкцию, а третий – дизъюнкцию.
Оператор | Операция | Описание | Пример | Результат |
---|---|---|---|---|
not |
Отрицание | Изменяет значение операнда на противоположное: True становится False , а False – True . |
not True |
False |
and |
Конъюнкция | Возвращает True , если оба операнда истинны, иначе – False . |
True and False |
False |
or |
Дизъюнкция | Возвращает True , если хотя бы один из операндов истинен, иначе – False . |
True or False |
True |
True
и False
), а их приоритет аналогичен тому, который установлен для арифметических операций:
- Отрицание
- Конъюнкция (логическое умножение)
- Дизъюнкция (логическое сложение)
Но с помощью круглых скобок можно изменить приоритет выполнения операторов, например, чтобы сначала выполнился оператор or
, и только затем and
:
print(18 > 16 and (4 == 5 or 1 > 0))
# Вывод: True
Логическое отрицание
Задача оператора not
состоит в изменении исходного значения на противоположное. Так истинное значение становится ложным и наоборот:
print(not(True))
# Вывод: False
print(not(10 > 0))
# Вывод: False
Конъюнкция: логическое умножение
Результат конъюнкции или логического умножения с помощью оператора and
будет истинным лишь тогда, когда каждое объединяемое выражение истинно. Поэтому его также называют логическим «И»:
print(20 >= 18 and 20 <= 21)
# Вывод: True
Процесс вычисления такого выражения происходит поэтапно:
1. Вычисляется значение первого операнда: 20 >= 18 (True)
.
2. Вычисляется значение второго операнда: 20 <= 21 (True)
.
3. Вычисляется значение полученного выражения: True and True = True
.
Однако если бы в первом выражении мы бы получили False
, то все следующие шаги были бы пропущены. Это называется ленивым вычислением, так как возвращается первый полученный False
:
print(12 >= 18 and 12 <= 21)
# Вывод: False
Дизъюнкция: логическое сложение
В отличии от конънкции результат дизъюнкции будет истинным, если истинно хотя бы одно из объединяемых выражений, поэтому её также называют логическим «ИЛИ»:
print(17 >= 18 or 27 <= 35)
# Вывод: True
Такое выражение тоже вычисляется последовательно, пока не встретится первое истинное значение. После этого выражение возвращает True
и дальнейшие вычисления не происходят.
Но если при вычислении значений всех выражений не было получено ни одного значения True
, то будет возвращен False
:
print(17 >= 18 or 17 <= 12)
# Вывод: True
1. Какие из следующих объектов являются истинными?
n = 20
reply = ""
message = "Сегодня выпало много снега"
is_admin = False
count = 0
2. Что будет выведено на экран в результате выполнения данного кода?
print(145 < -1)
print(89 != 19)
print("Сегодня солнечно" == "Сегодня солнечно")
print(91 >= -1)
print("Доступ разрешён" != "Доступ запрещён")
3. Что будет выведено на экран в результате выполнения данного кода?
print(92 > 1 or "Кто ты" != "Кто я")
print(not(84 == 84))
print(23 > 1 and not(90) or 1 < -9)
print(10 != 23 or 1 > 2 and "Яблоко" == "Яблоко")
print(98 <= 100 and 12 != 98 and 78 > -1 and not(1 > 2))
4. В каком порядке выполняются логические операции?
5. Напишите программу, которая принимает на вход год рождения, и выводит на экран True
или False
в зависимости от того, лежит ли введённое значение в пределах от 2000
до 2004
.
Пример входных данных | Пример выходных данных |
---|---|
2004 | True |
2001 | True |
1990 | False |