Истинность значений
Представьте, что вы проверяете почтовый ящик. Вам неважно, что написано в письмах: важно только, лежит ли там хоть что-то. Пустой ящик значит «почты нет». Ящик с одним листком значит «почта есть», даже если на листке написано «ничего».
Условие после if не обязано быть сравнением или значением типа bool. Python принимает там любое значение и смотрит на него, как вы на ящик: пустое оно или нет.
name = ""
if name:
print("Hello,", name)
else:
print("no name") # no nameДавайте разберём пример по строкам:
name = ""кладёт в переменную пустую строку: это ящик без писем.if name:спрашивает, есть ли в строке хоть один символ. Символов нет, и условие считается ложным.- Поэтому выполняется ветка
else, и программа печатаетno name.
Это правило называют истинностью значения: каждое значение в условии ведёт себя либо как True, либо как False.
Ложные значения
Из уже знакомых типов ложными считаются пять значений:
False;None;- ноль
0и ноль0.0; - пустая строка
"".
Все остальные значения истинные: любое ненулевое число, в том числе отрицательное, и любая непустая строка. Строка из одного пробела " " не пуста. Строка "0" тоже не пуста: в ней один символ, цифра ноль.
Для чисел аналогия с ящиком работает не до конца. Число 0 не «пустое», это обычное число. Правило для чисел своё: ложен только ноль, а -1 и 0.5 истинны.
Какие значения ложны, часто спрашивают на собеседовании. Отвечайте по типам: у чисел ложен ноль, у строк — пустая строка, а ещё ложны False и None.
Функция bool
Функция bool() показывает, как значение поведёт себя в условии:
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Разберём строки:
0и0.0ложны, а-1истинно: у чисел ложен только ноль.- Пустая строка ложна, а строки
" "и"0"истинны: в каждой есть символ. Noneложно, а строка"False"истинна.
bool("False") даёт True: функция не читает текст строки, а смотрит только, пуста ли она. Это тот самый листок «ничего» в ящике. Условие if name: проверяет значение по тому же правилу, что и bool(name).
Проверка через not
Запись if name: короче, чем if name != "":, и для строк означает то же. Обратную проверку пишут через not: условие not name истинно, когда name ложно. Так удобно проверять значение, которое может оказаться None:
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".
Частая ошибка
Число пришло в виде строки, и его проверяют без преобразования. Так бывает с любыми данными, которые программа получает как текст:
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 и подпишись на канал — откроются все уроки.