Тип данных bool и логические значения в Python
В этом уроке вы узнаете о типе данных bool в Python и о том, как эффективно обрабатывать логические значения.
- Класс bool в Python
- Сравнение логических значений
- Как работает конструктор bool() «под капотом»
- Метод __bool__()
- Метод __len__()
Класс 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():