bool(), type(), isinstance()Аннотация. Урок посвящен логическому типу данных bool.
Ранее мы изучали примитивные типы данных, такие как int, float, str, list и т.д. В их числе мы упоминали и о логическом типе данных, однако вскользь. Давайте закроем пробелы текущим уроком, который посвящен целиком и полностью логическому типу данных, который в Python представлен типом bool 😇.

Встроенные типы данных
Логический тип данных (булев тип, Boolean) — примитивный тип данных в информатике, принимающий два возможных значения, иногда называемых истиной (True) и ложью (False). Присутствует в подавляющем большинстве языков программирования как самостоятельная сущность или реализуется через численный тип данных. В некоторых языках программирования за значение "истина" принимается 11, за значение "ложь" — 00.
Название типа Boolean получило в честь английского математика и логика Джорджа Буля, среди прочего занимавшегося вопросами математической логики в середине XIX века.
Логические значения True (истина) и False (ложь) представляют тип данных bool. У этого типа только два возможных значения и два соответствующих литерала: True и False.
Мы активно использовали логический тип данных, когда работали с флагами:
flag = False
или когда использовали условный оператор if-else:
a = 100
b = 17
if b > a:
print('b больше a')
else:
print('b не больше a')
Результатом логического выражения b > a является булево значение, в данном примере False, так как значение в переменной b меньше значения в переменной a.
Логические выражения можно использовать не только в условном операторе.
Следующий программный код:
print(17 > 7)
print(17 == 7)
print(17 < 7)
выведет:
True
False
False
Логический тип данных – основа информатики.
Для создания произвольно сложных логических выражений (условий) мы используем три логические операции:
and);or);not).Логические операции используют операнды со значениями True и False и возвращают результат также с логическими значениями. Определённые для объектов типа bool операторы (and, or, not) известны как логические операторы и имеют общеизвестные определения:
a and b даёт True, если оба операнда True, и False, если хотя бы один из них False;a or b даёт False, если оба операнда False, и True, если хотя бы один из них True;not a даёт True, если a имеет значение False, и False, если a имеет значение True.Следующий программный код:
a = True
b = False
print('a and b is', a and b)
print('a or b is', a or b)
print('not a is', not a)
выведет:
a and b is False
a or b is True
not a is False
Запомните: приоритет оператора not выше, чем у оператора and, приоритет которого, в свою очередь, выше, чем у оператора or.
Логические значения в Python можно трактовать как числа. Значению True соответствует число 11, в то время как значению False соответствует 00. Таким образом, мы можем сравнить логические значения с числами:
Следующий программный код:
print(True == 1)
print(False == 0)
выведет:
True
True
Мы можем также применять арифметические операции к логическим значениям.
Следующий программный код:
print(True + True + True - False)
print(True + (False / True))
выведет:
3
1.0
Возможность трактовать булевы выражения как числа на практике используется не так часто. Однако есть один прием, который может оказаться полезным. Поскольку True равно 11, а False равно 00, сложение логических значений вместе – это быстрый способ подсчета количества значений True. Это может пригодиться, когда требуется подсчитать количество элементов, удовлетворяющих условию.
Следующий программный код:
numbers = [1, 2, 3, 4, 5, 8, 10, 12, 15, 17]
res = 0
for num in numbers:
res += (num % 2 == 0)
print(res)
выведет количество четных элементов списка numbers, то есть число 5.
Примечание 1. Вместо избыточного кода:
if flag == True:
программисты обычно пишут код:
if flag:
Аналогично, вместо кода
if flag == False:
программисты обычно пишут код:
if not flag:
Примечание 2. Операторы and и or ленивые:
x and y, если x == False, то результат всего выражения x and y будет False, так что y не вычисляется;x or y, если x == True, то результат всего выражения x or y будет True, и y не вычисляется.Примечание 3. Математическая теория булевой логики определяет, что никакие другие операторы, кроме not, and и or, не нужны. Все остальные операторы на двух входах могут быть указаны в терминах этих трех операторов. Все операторы на трех или более входах могут быть указаны в терминах операторов двух входов.
Фактически, даже наличие пары or и and избыточно. Оператор and может быть определен в терминах not и or, а оператор or может быть определен в терминах not и and. Однако, and и or настолько полезны, что во всех языках программирования есть и то, и другое.
Примечание 4. Встроенные типы данных на английском языке.

Примечание 5. Приведем таблицы истинности для логических операторов and, or, not:

Примечание 6. Посмотреть фильм о Джордже Буле на русском языке можно по ссылке.
bool(), type(), isinstance()Для приведения других типов данных к булеву существует функция bool(), работающая по следующим соглашениям:
False), непустая строка — истина (True);False), ненулевое число (в том числе и меньшее нуля) — истина (True);False), непустой — истина (True).Следующий программный код:
print(bool('Beegeek'))
print(bool(17))
print(bool(['apple', 'cherry']))
print(bool())
print(bool(''))
print(bool(0))
print(bool([]))
выведет:
True
True
True
False
False
False
False
Если функцию bool() вызвать без аргументов, то она вернет значение False.
Мы можем создавать функции, возвращающие булевы значения (True или False). Такая практика очень полезна. Напишем функцию is_even(), принимающую одно число и возвращающую значение True, если переданное число четное и False - в противном случае:
def is_even(num):
return num % 2 == 0
Следующий программный код:
print(is_even(8))
print(is_even(7))
выведет:
True
False
В программировании функция, которая возвращает значение True или False, называется предикатом.
В языке Python имеется встроенная функция isinstance() для проверки соответствия типа объекта какому-либо типу данных.
Следующий программный код:
print(isinstance(3, int))
print(isinstance(3.5, float))
print(isinstance('Beegeek', str))
print(isinstance([1, 2, 3], list))
print(isinstance(True, bool))
выведет:
True
True
True
True
True
Число 33 – целое число, число 3.53.5 – вещественное число, 'Beegeek' – строка и т.д.
Следующий программный код:
print(isinstance(3.5, int))
print(isinstance('Beegeek', float))
выведет:
False
False
так как число 3.53.5 не целое (float не int), 'Beegeek' - строка, а не вещественное число (str не float).
В языке Python имеется встроенная функция type(), позволяющая получить тип указанного в качестве аргумента объекта.
Следующий программный код:
print(type(3))
print(type(3.5))
print(type('Beegeek'))
print(type([1, 2, 3]))
print(type(True))
выведет:
<class 'int'>
<class 'float'>
<class 'str'>
<class 'list'>
<class 'bool'>
Функция type() часто бывает полезна при отладке программного кода, а также в реальном коде, особенно в объектно-ориентированном программировании с наследованием и пользовательскими строковыми представлениями, но об этом позже.
Обратите внимание, что при проверке типов обычно вместо функции type() используется функция isinstance(), так как она принимает во внимание иерархию типов (ООП).