Константы True и False: применение логического типа

Раздел: Основы Python -> Основы Python: логические значения

Логические значения True и False в Python

Основной принцип: булевы значения напрямую используются в условиях

В Python True и False представляют истину и ложь. Они принадлежат типу bool, который является подтипом int. Наиболее эффективный способ проверки условия - опираться на сами булевы значения или на «правдивость» (truthiness) объектов, не прибегая к избыточным сравнениям.


# Пример эффективного использования
my_list = [1, 2, 3]
if my_list:
    print('Список не пуст')
else:
    print('Список пуст')
  

Python true false (логические значения true и false в python)

Список не пуст
  

Сравните с менее эффективным вариантом if len(my_list) > 0: - первый вариант читается легче и выполняется быстрее за счёт встроенной проверки на истинность.

Типичная ошибка:

Некоторые новички пишут if x == True: или if x is True:. Первый вариант избыточен, второй опасен, так как is проверяет идентичность, а x может быть истинным (например, число 1), но не совпадать с объектом True. Используйте просто if x:.

Как преобразовать любой объект в булево значение?

Функция bool() возвращает True или False на основе «правдивости» объекта. Правила: falsy значения - None, False, ноль (0, 0.0, 0j), пустые коллекции ([], (), {}, '', set()). Всё остальное - True.


print(bool(0))
print(bool(42))
print(bool([]))
print(bool(''))
print(bool('Hello'))
  
False
True
False
False
True
  

Частая ошибка:

Неявное преобразование может привести к неожиданному поведению. Например, bool('False') возвращает True, так как непустая строка всегда истинна. Для проверки содержимого используйте сравнение строк.

Как объединить несколько условий с помощью логических операторов?

Операторы and, or и not работают с булевыми значениями, но могут возвращать не только True/False, а один из операндов (короткое замыкание).


a = 10
b = 5
if a > 0 and b > 0:
    print('Оба числа положительные')

# Короткое замыкание or
name = input('Введите имя: ') or 'Гость'
print('Привет,', name)
  
Оба числа положительные
Привет, Гость (если пользователь ничего не ввёл)
  

Проблема:

Приоритет операторов: not выше, чем and, and выше, чем or. Забыв скобки, можно получить неверный результат. Например, not True and False интерпретируется как (not True) and False. Всегда используйте скобки для сложных выражений.

Как сравнивать объекты и получать True/False?

Операторы сравнения: ==, !=, <, >, <=, >=. Они возвращают bool. Можно сравнивать числа, строки, списки и т.д.


print(5 == 5.0)        # True (сравнение по значению)
print('abc' < 'abd')  # True (лексикографически)
print([1,2] == [1,2])  # True
print(1 is 1)          # True (но is не для сравнения значений)
  
True
True
True
True
  

Ошибка сравнения с плавающей точкой:

Из-за неточного представления чисел с плавающей точкой сравнение 0.1 + 0.2 == 0.3 даёт False. Правильнее использовать abs(0.1+0.2-0.3) < 1e-9.

Как проверить, равен ли объект None?

Для проверки на None используйте оператор is (сравнение по идентичности), а не ==, так как == может быть переопределён в пользовательских классах.


x = None
if x is None:
    print('x - None')
  
x - None
  

Распространённая ошибка:

Использование if x == None: работает, но PEP 8 рекомендует if x is None. В некоторых случаях особенно важно именно is (например, при работе с pandas.NA).

Как применить булевы значения в списковых включениях?

Фильтрация элементов: условие после if оценивается как bool. Можно также использовать булеву маску.


numbers = [0, 1, 2, 3, 4, 5]
even = [n for n in numbers if n % 2 == 0]
print(even)

# Булева маска (например, для numpy)
mask = [True, False, True, False, True, False]
filtered = [n for n, m in zip(numbers, mask) if m]
print(filtered)
  
[0, 2, 4]
[0, 2, 4]
  

Нюанс:

Условие в списковом включении должно быть булевым выражением. Если используется небулев объект, он будет преобразован к bool по правилам truthiness. Например, [x for x in range(-2,3) if x] отфильтрует ноль.

Расширенные примеры работы с булевыми значениями

Пример 1: Булевы значения как целые числа

Поскольку bool является подтипом int, True соответствует 1, False - 0. Это позволяет использовать булевы значения в арифметических операциях, индексации и суммировании.

Пример

result = True + True   # 2
print(result)
print(True * 5)        # 5
print(False - 1)       # -1

# Индексация: True выбирает второй элемент (индекс 1)
items = ['первый', 'второй']
print(items[True])     # 'второй'

# Подсчёт количества True в списке
booleans = [True, False, True, True]
count_true = sum(booleans)
print(count_true)      # 3
  
2
5
-1
второй
3
  

Такое поведение может быть полезным, но его стоит использовать осознанно, чтобы не ухудшить читаемость.

Пример 2: Короткое замыкание с присваиванием значения по умолчанию

Логические операторы or и and возвращают не обязательно bool, а один из операндов. Это часто используют для присваивания значения по умолчанию.

Пример

def get_config(key, default='не указано'):
    return config.get(key) or default

config = {'name': 'test', 'value': 0}
print(get_config('name'))   # 'test'
print(get_config('value'))  # 'не указано' (так как 0 -> falsy)
print(get_config('missing')) # 'не указано'
  
test
не указано
не указано
  

Осторожно: такой подход не подходит, если 0 или пустая строка являются допустимыми значениями. В таких случаях лучше использовать явную проверку на None.

Пример 3: Использование any() и all() для коллекций

Встроенные функции any() и all() принимают итерируемый объект и возвращают True, если любой (или все) элементы истинны по правилам truthiness. Это эффективный способ проверки условий без явных циклов.

Пример

# Проверка, есть ли в списке хотя бы одно чётное число
numbers = [1, 3, 5, 7]
print(any(n % 2 == 0 for n in numbers))  # False

# Проверка, что все числа положительные
positives = [2, 4, 6, 8]
print(all(n > 0 for n in positives))     # True

# Работа с текстом: все строки непустые?
lines = ['первая', 'вторая', '']
print(all(lines))                        # False (пустая строка -> False)
  
False
True
False
  

Эти функции удобны при валидации данных или в условных выражениях.

Пример 4: Булевы флаги для управления циклом while

Использование булевой переменной как флага для управления повторением цикла - классический приём.

Пример

running = True
count = 0
while running:
    user_input = input('Введите \'stop\' для выхода: ')
    if user_input == 'stop':
        running = False
    else:
        count += 1
        print(f'Вы ввели {count} раз(а)')
  

Результат будет зависеть от ввода пользователя. Флаг явно показывает условие завершения.

Предостережение:

Не изменяйте флаг внутри цикла косвенным образом (например, через глобальную переменную в функции). Лучше использовать локальный флаг.

Пример 5: Булевы значения в декораторах (управление выполнением)

Декоратор может принимать булев параметр, определяющий, нужно ли выполнять обёрнутую функцию или применять дополнительную логику.

Пример

def conditional_decorator(condition):
    def decorator(func):
        if condition:
            def wrapper(*args, **kwargs):
                print('Логирование перед вызовом')
                return func(*args, **kwargs)
            return wrapper
        else:
            return func
    return decorator

@conditional_decorator(True)
def say_hello(name):
    print(f'Привет, {name}')

say_hello('Мир')
# Вывод: Логирование перед вызовом
#        Привет, Мир
  

Если параметр condition будет False, декоратор не изменит функцию.

Логические значения True и False в Python - comments

En
Python true false (python)