Баннер мобильный (3) Пройти тест

Что такое логические переменные в Python и зачем они нужны

True, False и ничего лишнего

Разбор

30 марта 2026

Поделиться

Скопировано
Что такое логические переменные в Python и зачем они нужны

Содержание

    Узнаем, что такое логические переменные в языке программирования 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 и наоборот. Ниже приводится так называемая таблица истинности для данного оператора:

    a
    not a
    True
    False
    False
    True

    Простой пример:

    user_active = True
    print(not user_active)

    В консоли получим следующий результат:

    False

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

    user_active = False
    print(not user_active)

    То и в консоли будем иметь противоположный результат:

    True

    Оператор and (И)

    В отличие от not, этот оператор работает с двумя операндами, то есть является бинарным, а не унарным оператором. Оператор and возвращает True только в том случае, если все операнды истинны. Таблица истинности для этого оператора выглядит так:

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

    Пример:

    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, если хотя бы один из операндов истинен. Таблица истинности для этого оператора выглядит следующим образом:

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

    Пример:

    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

    Разбор

    Поделиться

    Скопировано
    0 комментариев
    Комментарии