Перейти к содержимому
Теория · Условия · урок 3 из 8

Истинность значений

Представьте, что вы проверяете почтовый ящик. Вам неважно, что написано в письмах: важно только, лежит ли там хоть что-то. Пустой ящик значит «почты нет». Ящик с одним листком значит «почта есть», даже если на листке написано «ничего».

Условие после if не обязано быть сравнением или значением типа bool. Python принимает там любое значение и смотрит на него, как вы на ящик: пустое оно или нет.

Python
name = ""
if name:
    print("Hello,", name)
else:
    print("no name")  # no name

Давайте разберём пример по строкам:

  1. name = "" кладёт в переменную пустую строку: это ящик без писем.
  2. if name: спрашивает, есть ли в строке хоть один символ. Символов нет, и условие считается ложным.
  3. Поэтому выполняется ветка else, и программа печатает no name.

Это правило называют истинностью значения: каждое значение в условии ведёт себя либо как True, либо как False.

Ложные значения

Из уже знакомых типов ложными считаются пять значений:

  • False;
  • None;
  • ноль 0 и ноль 0.0;
  • пустая строка "".

Все остальные значения истинные: любое ненулевое число, в том числе отрицательное, и любая непустая строка. Строка из одного пробела " " не пуста. Строка "0" тоже не пуста: в ней один символ, цифра ноль.

Для чисел аналогия с ящиком работает не до конца. Число 0 не «пустое», это обычное число. Правило для чисел своё: ложен только ноль, а -1 и 0.5 истинны.

Какие значения ложны, часто спрашивают на собеседовании. Отвечайте по типам: у чисел ложен ноль, у строк — пустая строка, а ещё ложны False и None.

Функция bool

Функция bool() показывает, как значение поведёт себя в условии:

Python
print(bool(0), bool(-1), bool(0.0))  # False True False
print(bool(""), bool(" "), bool("0"))  # False True True
print(bool(None), bool("False"))  # False True

Разберём строки:

  1. 0 и 0.0 ложны, а -1 истинно: у чисел ложен только ноль.
  2. Пустая строка ложна, а строки " " и "0" истинны: в каждой есть символ.
  3. None ложно, а строка "False" истинна.

bool("False") даёт True: функция не читает текст строки, а смотрит только, пуста ли она. Это тот самый листок «ничего» в ящике. Условие if name: проверяет значение по тому же правилу, что и bool(name).

Проверка через not

Запись if name: короче, чем if name != "":, и для строк означает то же. Обратную проверку пишут через not: условие not name истинно, когда name ложно. Так удобно проверять значение, которое может оказаться None:

Python
discount = None
if not discount:
    print("no discount")  # no discount

У такой проверки есть оборотная сторона. Ложны и None, и 0, поэтому при discount = 0 программа тоже напечатает no discount. Когда ноль нужно отличать от отсутствия значения, пишите сравнение, а не проверку истинности: if discount == 0: сработает только для нуля.

Запасное значение через or

Как вы уже знаете из темы об операторах, and и or работают по тем же правилам. Выражение name or "guest" возвращает name, если строка непустая, и "guest", если она пустая. Так задают значение на случай, когда настоящего нет: пустое имя превращается в "guest".

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

Число пришло в виде строки, и его проверяют без преобразования. Так бывает с любыми данными, которые программа получает как текст:

Python
count = "0"
if count:  # ✗
    print("has items")  # has items

Ошибки нет, но программа печатает has items. Строка "0" не пуста, поэтому истинна, хотя число в ней — ноль. Сначала преобразуйте строку в число: условие if int(count): ложно.

Главное

  • В условии любое значение ведёт себя как True или False, и bool(x) показывает, как именно.
  • Ложны False, None, ноль и пустая строка, а все остальные значения истинны.
  • Строки "0" и "False" истинны: важна пустота строки, а не её текст.
  • Когда ноль нужно отличить от None, пишут сравнение, а не if not x:.

Подпишись, чтобы пройти курс

Курс бесплатный. Войди через Telegram и подпишись на канал — откроются все уроки.

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