Перейти к содержимому
Теория · Операторы · урок 7 из 9

bool — это число

В прошлом уроке сравнения давали True или False. Теперь посмотрим, что эти значения умеют в арифметике.

Представьте голосование в классе. Учитель задаёт вопрос, и каждый ученик либо поднимает руку, либо нет. Поднятая рука — это единица, опущенная — ноль. Сложите все руки, и вы узнаете, сколько человек ответили «да».

Python устроен так же. Тип bool в Python — разновидность int: True ведёт себя как 1, а False — как 0.

Python
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

Давайте разберём каждую строку:

  1. True == 1 и False == 0 дают True: для сравнения с числом это одно и то же.
  2. True + True — это 2, а True * 10 — это 10.
  3. int(True) и int(False) явно превращают их в 1 и 0.
  4. True + 0.5 даёт 1.5 типа float, как сложение int с float.

Здесь аналогия с руками заканчивается. Печатается True по-прежнему словом: print(True) выводит True, а не 1. Числом оно становится только в арифметике и в сравнении с числом. Поэтому True == 1 даёт True, хотя у этих значений разные типы.

Подсчёт сравнениями

Верное сравнение равно 1, а неверное — 0. Поэтому сумма нескольких сравнений равна числу верных среди них. Так считают, сколько условий из нескольких выполнено, без единой проверки по отдельности:

Python
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

Разберём первый вызов по шагам:

  1. 5 > 0 даёт True — первая поднятая рука.
  2. -2 > 0 даёт False — рука опущена.
  3. 7 > 0 даёт True — вторая рука.
  4. 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 или к его разновидности:

Python
print(type(True))  # <class 'bool'>
print(isinstance(True, int))  # True
print(isinstance(1, bool))  # False

Разберём результаты:

  1. Точный тип True — bool.
  2. Но для isinstance оно ещё и int, ведь bool — разновидность int.
  3. Обратное неверно: 1 — это только int.

Поэтому функция, которая ждёт число, примет True без ошибки и посчитает его единицей. Этот вопрос часто задают на собеседовании: «Чему равно True + True и почему?» Ответ — 2, потому что bool — разновидность int.

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

Сумму сравнений записывают без скобок:

Python
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 и подпишись на канал — откроются все уроки.

Войти другим способом