Тип данных bool и логические значения в Python

В этом уроке вы узнаете о типе данных bool в Python и о том, как эффективно обрабатывать логические значения.

Содержание

Класс bool в Python

Для представления логических значений, включая True и False, Python использует встроенный класс bool.

Класс bool является подклассом класса int. Это означает, что класс bool наследует все свойства и методы класса int. Кроме того, класс bool имеет особое поведение, связанное с логическими операциями.

Если вы используете функцию issubclass() для классов bool и int, она вернет True следующим образом:

is_child_class = issubclass(bool, int)
print(is_child_class)

Выход:

True

Фактически True и False являются одноэлементными объектами класса bool.

isinstance(True, bool)
isinstance(False, bool)

Выход:

В следующем примере функция isinstance() используется для проверки того, являются ли True и False экземплярами класса bool:

True
True

Поскольку и True, и False также являются объектами типа int, вы можете преобразовать их в целые числа:

true_value = int(True)
print(true_value)

false_value = int(False)
print(false_value)

Выход:

1
0

Как видите, Python интерпретирует True как 1, а False — как 0. Обратите внимание, что True и 1 — это не один и тот же объект. Аналогично, False и 0 — это не одно и то же.

Сравнение логических значений

True и False являются одноэлементными объектами, которые всегда ссылаются на одни и те же объекты в памяти на протяжении всей программы, поэтому для сравнения логических значений можно использовать оператор is или ==. Результаты будут те же. Например:

a = True
b = True

print(a == b)
print(a is b)

Выход:

True
True

То же самое применимо и к объекту False:

a = False
b = False

print(a == b)
print(a is b)

Выход:

True
True

Как работает конструктор bool() «под капотом»

Логический конструктор bool() принимает объект и возвращает True или False.

В Python класс всегда содержит определение того, как его экземпляры оцениваются как True и False. Другими словами, каждый объект может быть либо истинным, либо ложным.

Все объекты имеют логическое значение True, за исключением следующих объектов:

  • None;
  • False;
  • 0 в любом числовом типе, таком как целое число, число с плавающей запятой и десятичное число;
  • пустые последовательности, например список, кортеж, строка;
  • пустые типы сопоставлений, например словарь, множество;
  • пользовательские классы, реализующие методы __bool__() или __len__(), возвращающие False или 0;

…которые имеют логическое значение False.

Метод __bool__()

Когда вы передаете объект конструктору bool(), Python возвращает значение метода __bool__() этого объекта.

Например, ниже показан метод __bool__() класса int:

def __bool__(self):
    return self != 0

Когда вы вызываете:

bool(200)

…Python фактически выполняет:

200.__bool__()

…и, следовательно, возвращает результат 200 != 0, что соответствует true.

Однако, если вы вызовите:

bool(0)

…Python выполняет:

0.__bool__()

… и, следовательно, возвращает результат 0 != 0, что является ложью.

Метод __len__()

Если класс объекта не имеет метода __bool__(), Python вернет результат метода __len__(). Если результат метода __len__() равен нулю, bool() возвращает False. В противном случае он возвращает True. Вот почему пустой список всегда имеет значение False, а список, содержащий хотя бы один элемент, — True.

Предположим, что у вас есть функция, которая возвращает список или None. Список результатов может содержать ноль или более элементов:

def get_list():
    # ...

Для отображения элементов списка можно придумать следующий код:

my_list = get_list()

if my_list is not None and len(my_list) > 0:
    for element in my_list:
        print(element)
else:
    print('List is None or empty')

Условие в предложении if гарантирует, что my_list не имеет значения None или пусто.

Однако это условие не является необходимым, поскольку вы можете сократить его. Код работает так же:

my_list = get_list()

if my_list:
    for element in my_list:
        print(element)
else:
    print('List is None or empty')

В этом случае, если my_list имеет значение None или пуст, Python оценивает его как False.

Наконец, если класс не имеет методов __bool__() и __len__(), экземпляры этого класса всегда оцениваются как True.

Следующая блок-схема иллюстрирует, как работает bool():

Схема работы bool() в Python 

Похожие посты
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *