bool — это число
В прошлом уроке сравнения давали True или False. Теперь посмотрим, что эти значения умеют в арифметике.
Представьте голосование в классе. Учитель задаёт вопрос, и каждый ученик либо поднимает руку, либо нет. Поднятая рука — это единица, опущенная — ноль. Сложите все руки, и вы узнаете, сколько человек ответили «да».
Python устроен так же. Тип bool в Python — разновидность int: True ведёт себя как 1, а False — как 0.
print(True == 1, False == 0) # True True
print(True + True, True * 10) # 2 10
print(int(True), int(False)) # 1 0
print(True + 0.5) # 1.5Давайте разберём каждую строку:
True == 1иFalse == 0даютTrue: для сравнения с числом это одно и то же.True + True— это2, аTrue * 10— это10.int(True)иint(False)явно превращают их в1и0.True + 0.5даёт1.5типаfloat, как сложениеintсfloat.
Здесь аналогия с руками заканчивается. Печатается True по-прежнему словом: print(True) выводит True, а не 1. Числом оно становится только в арифметике и в сравнении с числом. Поэтому True == 1 даёт True, хотя у этих значений разные типы.
Подсчёт сравнениями
Верное сравнение равно 1, а неверное — 0. Поэтому сумма нескольких сравнений равна числу верных среди них. Так считают, сколько условий из нескольких выполнено, без единой проверки по отдельности:
def count_positive(a, b, c):
return (a > 0) + (b > 0) + (c > 0)
print(count_positive(5, -2, 7)) # 2
print(count_positive(-1, 0, -3)) # 0Разберём первый вызов по шагам:
5 > 0даётTrue— первая поднятая рука.-2 > 0даётFalse— рука опущена.7 > 0даётTrue— вторая рука.True + False + True— это2, и функция возвращает2.
Во втором вызове ни одно число не больше нуля, поэтому сумма — 0. Заметьте, что ноль положительным не считается: 0 > 0 даёт False.
Сравнение такой суммы с числом отвечает, выполнены ли хотя бы два условия из трёх: count_positive(a, b, c) >= 2. Сама сумма имеет тип int, а не bool: True + True — это 2.
Тот же приём работает с умножением: price * (count > 10) равно price, если товаров больше десяти, и 0 в остальных случаях. Такой код короткий, но смысл его виден не сразу. Поэтому приём берут прежде всего для подсчёта.
Проверка типа
Функция type называет точный тип значения. isinstance(x, t) отвечает, относится ли x к типу t или к его разновидности:
print(type(True)) # <class 'bool'>
print(isinstance(True, int)) # True
print(isinstance(1, bool)) # FalseРазберём результаты:
- Точный тип
True—bool. - Но для
isinstanceоно ещё иint, ведьbool— разновидностьint. - Обратное неверно:
1— это толькоint.
Поэтому функция, которая ждёт число, примет True без ошибки и посчитает его единицей. Этот вопрос часто задают на собеседовании: «Чему равно True + True и почему?» Ответ — 2, потому что bool — разновидность int.
Частая ошибка
Сумму сравнений записывают без скобок:
a = 5
b = -2
count = a > 0 + b > 0 # ✗
print(count) # FalseОшибки нет, но ждали 1. + выполняется раньше сравнений, поэтому выражение читается как цепочка a > (0 + b) > 0, то есть 5 > -2 > 0. Вторая её часть неверна, и вся цепочка даёт False. Каждое сравнение берут в скобки: (a > 0) + (b > 0) даёт 1.
Главное
bool— разновидностьint: в арифметикеTrue— это1, аFalse—0.- Сумма сравнений в скобках считает, сколько из них верны.
isinstance(True, int)даётTrue, ноtype(True)— этоbool, и печатаетсяTrueсловом.
Подпишись, чтобы пройти курс
Курс бесплатный. Войди через Telegram и подпишись на канал — откроются все уроки.