Логические выражения и логический тип данных
В повседневной жизни мы часто либо соглашаемся с каким-либо утверждением, либо его отвергаем. Например, если вы услышите, что сумма чисел 3 и 5 больше 7, вы, вероятно, согласитесь, заметив: «Да, это так». Однако, при утверждении, что сумма трех плюс пять меньше семи, вы скорее оцените это как ложное суждение.
Подобные утверждения подразумевают два возможных ответа – "да", когда выражение подтверждается как истина, или "нет", когда оно опровергается как ложь. В области программирования и математики, если результат выражения ограничен истиной или ложью, тогда это выражение называют логическим.
К примеру, выражение 4 > 5 является логическим, так как его конечный результат заключается в истинности или ложности. 4 + 5 не причисляют к логическим, потому что оно возвращает числовое значение.
В позапрошлом уроке был рассмотрен подход к трем типам данных: целым числам, вещественным числам и строкам. На этом занятии введем четвертый тип данных — логический или булевый (тип bool), который может принимать только два значения: True (да, истина) и False (нет, ложь).
>>> a = True >>> type(a) <class 'bool'> >>> b = False >>> type(b) <class 'bool'>
Переменной a было присвоено значение True, после чего при помощи встроенной функции Python type()
выяснился ее тип. Интерпретатор подтвердил, что это переменная класса bool
. Переменная b также имеет булево значение.
В программировании False часто приравнивается к нулю, а True – к единице. Убедиться в этом можно, преобразовав булевое значение в целочисленный тип:
>>> int(True) 1 >>> int(False) 0
Также возможен обратный процесс. Значения можно преобразовать к булевому типу:
>>> bool(3.4) True >>> bool(-150) True >>> bool(0) False >>> bool(' ') True >>> bool('') False
Это основывается на правиле: все, кроме 0 и пустоты, считается правдой.
Логические операторы
В разговорной речи мы сравниваем слова, используя выражения "равно", "больше", "меньше". Тогда как в программировании применяются особые символы, аналогичные математическим: > (больше), < (меньше), >= (больше или равно), <= (меньше или равно), == (равно), != (не равно).
Не приводите к путанице операцию присваивания значения переменной, обозначаемую в Python одиночным знаком "равно", с операцией сравнения (двойной знак "равно"). Присваивание и сравнение выполняют разные функции.
>>> a = 10 >>> b = 5 >>> a + b > 14 True >>> a < 14 - b False >>> a <= b + 5 True >>> a != b True >>> a == b False >>> c = a == b >>> a, b, c (10, 5, False)
В данном примере выражение c = a == b состоит из двух этапов. Сначала осуществляется сравнение (==) значений a и b. Затем результат этого сравнения присваивается переменной c. Выполнение оператора a, b, c просто демонстрирует их значения.
Сложные логические выражения
Логические выражения, такие как kByte >= 1023
, считаются простыми, поскольку содержат лишь одну логическую операцию. Однако часто возникает потребность в более сложных выражениях, чтобы получить ответ "да" или "нет" на основе выполнения нескольких простых оценок. Такие, как: "на улице идет снег или дождь", "переменная news больше 12 и меньше 20".
Для этого применяются специальные операторы, объединяющие два и более простых логических выражения. Наиболее популярными являются and (логическое И) и or (логическое ИЛИ).
Чтобы получить True, используя and, оба связанных простых выражения должны быть истинными. Если хотя бы одно из них возвращает False, то и все сложное выражение также будет False.
Для получения True с оператором or достаточно, чтобы хотя бы одно из простых выражений было правдой. Все сложное выражение станет ложным, только если оба простых выражения ложны.
Допустим, переменная x получила значение 8 (x = 8
), а переменная y — 13 (y = 13
). Логическое выражение y < 15 and x > 8
выполняется следующим образом: сначала вычисляется y < 15
, дающее True, затем x > 8
, дающее False. В итоге получаем True and False, что возвращает False.
>>> x = 8 >>> y = 13 >>> y < 15 and x > 8 False
Если бы мы сформировали другое выражение: x > 8 and y < 15
, итог также был бы False. Однако, второе сравнение y < 15
не было бы проведено интерпретатором, так как его выполнение излишне. Причина: первое простое логическое выражение (x > 8
) вернуло ложь, которая делает все выражение ложным.
В случае с оператором or второе простое выражение проверяется только если первое вернуло ложь; если первое вернуло истину, второе не проверяется. Достаточно одного True для истинности всего выражения, не важно, по какую сторону от or оно стоит.
>>> y < 15 or x > 8 True
В Python также существует унарный логический оператор not, представляющий отрицание. Он меняет истину на ложь и наоборот, применяясь только к одному выражению, записанному сразу после него, в отличие от бинарных and и or, которые связывают два выражения.
>>> not y < 15 False
Здесь y < 15
возвращает True, но отрицание посредством not
делает его False.
>>> a = 5 >>> b = 0 >>> not a False >>> not b True
Число 5 рассматривается как истина, отрицание истины ведет к получению лжи. Ноль эквивалентен False, а его отрицание приводит к True.
Практическая работа
- Присвойте двум переменным любые числовые значения.
- Используя переменные из шага 1, при помощи оператора and составьте два сложных логических выражения: одно должно возвращать истину, другое — ложь.
- Повторите шаг 2, но уже применяя оператор or.
- Например, попробуйте работать с переменными строкового типа в логических выражениях и объясните вывод программы.
- Напишите программу, которая запрашивает у пользователя два числа и выводит True или False в зависимости от того, больше ли первое число второго.