Узнаем, что такое логические переменные в языке программирования Python. Поговорим о логических операторах и о том какие они бывают. На простых примерах посмотрим как работают логические выражения с логическими переменными.
Что такое логические переменные
В языке программирования Python, как и во многих других, имеются переменные, которые могут принимать всего два значения: True и False. Такие переменные называются логическими. Значение True означает истину, а значение False — ложь. Рассмотрим простой пример:
has_password = True
if has_password:
print("Доступ разрешен")
else:
print("Доступ запрещен")
В этом примере логической переменной has_password (есть пароль) присваивается значение True. Это можно представить, как если бы какой-нибудь пользователь ввел правильный пароль для доступа на нужный ему сервис. Поэтому далее условный оператор выводит сообщение о разрешенном доступе и в консоли мы увидим такое сообщение:
Доступ разрешен
Если присвоить переменной has_password значение False:
has_password = False
if has_password:
print("Доступ разрешен")
else:
print("Доступ запрещен")
То получим сообщение о запрещенном доступе:
Доступ запрещен
В Python имеется тип bool, который можно представить как подтип целых чисел int и для которого определены следующие соответствия:
True — 1
False — 0
Поэтому имеет определенный смысл такой код:
print(True + True + True)
В консоли будет выведено:
3
Оно и понятно: ведь это то же самое, что и 1+1+1. Также в Python есть функция bool. Эта функция возвращает логическое значение True или False в зависимости от аргумента на входе. Несколько простых примеров:
print(bool(1))
print(bool(0))
print(bool(1000))
print(bool(""))
print(bool("abcde"))
В консоли получим:
True False True False True
Видим, что False мы получаем, когда на вход функции подается число 0 или пустая строка. В остальных случаях мы получаем True. Также False мы получим, если на входе функции будет значение None или какая-нибудь пустая последовательность.
Логические операторы
В Python имеются три логических оператора: not, and и or. Они нужны для составления логических выражений. Логические выражения — это конструкции в информатике и математике, которые строятся из логических переменных, операций сравнения и логических операторов. Ниже рассмотрим эти операторы.
Оператор not (НЕ)
Это унарный оператор, то есть работает только с одним операндом и применяется для инвертирования логического значения. Другими словами, этот оператор из True делает False и наоборот. Ниже приводится так называемая таблица истинности для данного оператора:
Простой пример:
user_active = True print(not user_active)
В консоли получим следующий результат:
False
Если мы поменяем значение переменной на противоположное, то есть сделаем вот так:
user_active = False print(not user_active)
То и в консоли будем иметь противоположный результат:
True
Оператор and (И)
В отличие от not, этот оператор работает с двумя операндами, то есть является бинарным, а не унарным оператором. Оператор and возвращает True только в том случае, если все операнды истинны. Таблица истинности для этого оператора выглядит так:
Пример:
age = 30
has_permission = True
if age >= 18 and has_permission:
print("Доступ разрешен")
else:
print("В доступе отказано")
Результат:
Доступ разрешен
Теперь поменяем, к примеру, значение переменной age:
age = 17
has_permission = True
if age >= 18 and has_permission:
print("Доступ разрешен")
else:
print("В доступе отказано")
Получим:
В доступе отказано
Если операнды не являются булевыми, то оператор and вернет первый ложный или последний операнд, если первый операнд истинный. То есть происходит неявный вызов функции bool для операндов, но оператор возвращает не булево значение, а какой-то из операндов. Пример:
print(0 and "Привет")
print("Привет" and 1000)
Результат в консоли:
0 1000
Если нужно обработать несколько переменных, то на помощь придет функция all. Она работает как серия операторов and. Простой пример использования с тремя переменными:
a = True b = True c = False print(all([a, b, c]))
То же самое, но без all:
a = True b = True c = False print(a and b and c)
В обоих случаях в консоли получим:
False
Оператор or (ИЛИ)
Также как и предыдущий оператор, работает с двумя операндами. Оператор or возвращает True, если хотя бы один из операндов истинен. Таблица истинности для этого оператора выглядит следующим образом:
Пример:
is_weekend = True
is_holiday = False
is_day_off = is_weekend or is_holiday
print(f"Нужно идти на учебу? {not is_day_off}")
Вывод в консоли:
Нужно идти на учебу? False
При работе с небулевыми операндами оператор or возвращает первый истинный или последний операнд, если первый операнд ложный. Здесь так же, как и в случае с оператором and происходит неявный вызов функции bool. Пример:
print("abc" or "xyz")
print("" or 10)
Результат:
abc 10
Если переменных много, то можно использовать функцию any. Она работает подобно серии операторов or. Вот так можно ее использовать:
a = True b = True c = False print(any([a, b, c]))
То же самое, но без any:
a = True b = True c = False print(a or b or c)
И в том и в другом случае в консоли получим один и тот же результат:
True
Логические выражения
В предыдущем разделе мы рассмотрели работу логических операторов на примерах с простейшими логическим выражениями. Но из логических переменных, простых выражений с операциями сравнения и логических операторов можно строить куда более сложные и полезные конструкции. Далее рассмотрим некоторые из них.
Доступ к сервису
Допустим, что у нас имеется некоторый сервис, и нужно проверить к нему право доступа по факту прохождения аутентификации, пользовательской роли и наличию действующей лицензии. Сделать это можно так:
is_authenticated = True
user_role = "admin"
has_valid_license = True
can_access = is_authenticated and has_valid_license and (user_role == "admin" or user_role == "moderator")
print(f"Доступ разрешен: {can_access}")
Как видим, получить доступ к сервису может только админ или модератор, которые прошли аутентификацию и имеют действующую лицензию. С указанными значениями переменных в консоли получим следующий результат:
Доступ разрешен: True
А теперь поменяем значение у переменной has_valid_license на противоположное, то есть теперь пользователь не имеет действующей лицензии:
is_authenticated = True
user_role = "admin"
has_valid_license = False
can_access = is_authenticated and has_valid_license and (user_role == "admin" or user_role == "moderator")
print(f"Доступ разрешен: {can_access}")
Результат в консоли уже будет такой:
Доступ разрешен: False
Отправка уведомления
Предположим, что нам необходимо проверить возможность для отправки уведомления пользователю с учетом того находится ли пользователь онлайн, может ли получать уведомления, включен ли у него режим не беспокоить, а также с учетом приоритета уведомления и того сколько прошло времени с момента последнего уведомления. Вот таким образом это может быть реализовано:
user_online = True
notification_enabled = True
is_quiet_hours = False
urgent_priority = True
last_notification_time = 10 # мин
send_notification = user_online and notification_enabled and \
(not is_quiet_hours or urgent_priority) and \
(urgent_priority or last_notification_time > 5)
print(f"Отправить уведомление: {send_notification}")
Итак, отправка уведомления возможна лишь в случае, если пользователь находится в режиме онлайн и у него есть возможность их получать (включена соответствующая функция). Уведомление будет отправлено, если выключен режим не беспокоить (переменная is_quiet_hours) или у уведомления есть высший (неотложный) приоритет (urgent_priority). То есть при высшем приоритете уведомление будет отправлено даже при включенном режиме тихого часа.
Также при отправке учитывается и время после отправки последнего уведомления. В нашем случае должно пройти больше 5-и минут. Но если выставлен высший приоритет, то параметр времени не будет учитываться. С указанными значениями переменных в консоли будет выведено следующее:
Отправить уведомление: True
Если сейчас поменять приоритет с высокого на низкий, то результат не изменится, так как у нас выключен тихий режим и время от последнего уведомления превышает пять минут. Поэтому поменяем вместе с приоритетом, например, время:
user_online = True
notification_enabled = True
is_quiet_hours = False
urgent_priority = False
last_notification_time = 3 # мин
send_notification = user_online and notification_enabled and \
(not is_quiet_hours or urgent_priority) and \
(urgent_priority or last_notification_time > 5)
print(f"Отправить уведомление: {send_notification}")
В консоли получим:
Отправить уведомление: False
Активация тревоги
Пусть нам поставлена задача описать логику для некоторой охранной системы. Нужно учитывать движение объектов в поле зрения датчиков, открыты ли окна и двери, готовность самой системы и возможность игнорирования датчиков. Пример реализации:
motion_detected = True
door_open = False
window_open = True
system_armed = True
ignore_sensors = False
trigger_alarm = (motion_detected or door_open or window_open) and \
system_armed and not ignore_sensors
print(f"Активировать тревогу: {trigger_alarm}")
Как видно из кода, тревога должна быть активирована в случае, если обнаружено какое-то движение (motion_detected) или были открыты двери или окна. Также система должна быть в состоянии готовности (system_armed) и в системе должно быть отключено игнорирование датчиков. Результат в консоли в приведенном случае будет такой:
Активировать тревогу: True
А теперь закроем все окна (двери и так были закрыты) и перестанем бродить по территории:
motion_detected = False
door_open = False
window_open = False
system_armed = True
ignore_sensors = False
trigger_alarm = (motion_detected or door_open or window_open) and \
system_armed and not ignore_sensors
print(f"Активировать тревогу: {trigger_alarm}")
Результат:
Активировать тревогу: False
Автоматический полив
Предположим, что у нас имеется система автоматического полива сада или огорода. Полив должен начинаться в зависимости от влажности почвы, прогноза осадков, времени суток, ограничения запаса воды и температуры воздуха. Один из способов реализации может выглядеть так:
soil_moisture = 30 # %
rain_forecast = False
time_of_day = "morning"
water_restriction_active = False
temperature = 28 # °C
start_irrigation = (soil_moisture < 40 or temperature > 25) and \
not rain_forecast and \
time_of_day in ["morning", "evening"] and \
not water_restriction_active
print(f"Запустить полив: {start_irrigation}")
Как легко можно видеть из приведенного кода, полив запускается при влажности почвы менее 40-ка процентов или при температуре более 25-и градусов. Также для запуска в прогнозе не должно быть дождя, полив происходит только утром или вечером и без активного ограничения воды. В данном случае вывод в консоли будет следующий:
Запустить полив: True
Теперь поменяем, например, время суток на день (afternoon):
soil_moisture = 30 # %
rain_forecast = False
time_of_day = "afternoon"
water_restriction_active = False
temperature = 28 # °C
start_irrigation = (soil_moisture < 40 or temperature > 25) and \
not rain_forecast and \
time_of_day in ["morning", "evening"] and \
not water_restriction_active
print(f"Запустить полив: {start_irrigation}")
В консоли увидим следующий результат:
Запустить полив: False
Валидность даты
Пусть требуется проверить валидность указанной даты с учетом количества дней в разных месяцах. То есть учитывать также надо и високосность года, так как в зависимости от нее в феврале может быть 28 или 29 дней. Ниже приводится пример реализации такой проверки:
year = 2025
month = 11
day = 30
is_leap = (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0)
is_february = month == 2
is_valid_day = (
(is_february and is_leap and day <= 29) or
(is_february and not is_leap and day <= 28) or
(month in [4, 6, 9, 11] and day <= 30) or
(month in [1, 3, 5, 7, 8, 10, 12] and day <= 31)
)
print(f"Дата корректна: {is_valid_day}")
Високосность проверяется при помощи довольно известного способа. В последнем разделе этой нашей публикации можно прочитать о нем более подробно. Для февраля в високосный год число дней должно быть не более 29-и, а в невисокосный — не более 28-и. В месяцах с номерами 4, 6, 9, 11 не больше 30-и дней, а с номерами 1, 3, 5, 7, 8, 10, 12 не больше 31-го дня. Для указанной даты в консоли получим:
Дата корректна: True
Теперь поменяем дату. Год 2025 был невисокосным и, следовательно, в феврале было 28 дней. Проверим дату 29 февраля 2025 года:
year = 2025
month = 2
day = 29
is_leap = (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0)
is_february = month == 2
is_valid_day = (
(is_february and is_leap and day <= 29) or
(is_february and not is_leap and day <= 28) or
(month in [4, 6, 9, 11] and day <= 30) or
(month in [1, 3, 5, 7, 8, 10, 12] and day <= 31)
)
print(f"Дата корректна: {is_valid_day}")
Результат:
Дата корректна: False
Мы рассмотрели лишь несколько несложных примеров с применением логических переменных в языке Python. Таких примеров можно привести великое множество. Далее предлагаем выполнить небольшое задание.
Задание для самостоятельного выполнения
Представим, что какому-то сервису необходимо отправлять пользователям погодные оповещения. Нужно, чтобы оповещения приходили, если температура больше 30-ти градусов или вероятность дождя более 70-и процентов или же скорость ветра превышает 6 метров в секунду. Оповещения должны приходить при наличии подписки в период времени с 6-и утра до 10-и вечера и не должны беспокоить пользователя в выходные дни.
Решение:
Условия с температурой, вероятностью дождя и скоростью ветра соединим оператором or. Все остальное пишем через and, но не забываем о выходных днях, в которые оповещения НЕ должны приходить. Проинициализировав переменные какими-нибудь подходящими значениями, получим примерно такой код:
temperature = 32 # °C
rain_probability = 80 # %
wind_speed = 4 # м/с
user_subscribed_to_alerts = True
is_day_off = False
current_time_hour = 8
send_weather_alert = (temperature > 30 or rain_probability > 70 or wind_speed > 6) and user_subscribed_to_alerts and not is_day_off and 6 <= current_time_hour <= 22
print(f"Отправить погодное оповещение: {send_weather_alert}")
Результат в консоли:
Отправить погодное оповещение: True
