Из этой статьи вы узнаете, что такое истинные и ложные значения, что делает значение истинным или ложным, как использовать функцию bool(), чтобы определить истинность или ложность значения, и как сделать объекты из пользовательских классов истинными или ложными с помощью специального метода __bool__().
Давайте начнем!
Выражения с операндами и операторами оцениваются как True или False. Они могут использоваться в условиях или циклах, чтобы определить, должен ли выполняться блок кода.
Приведем пример:
# Выражение 5 < 3
>>> if 5 < 3:
print("True")
else:
print("False")
# Вывод:
# False В этом примере все работает так, как мы ожидали, потому что мы использовали выражение с двумя операндами и оператором 5 < 3.
А что произойдет, если мы попытаемся запустить такой код?
>>> a = 5
>>> if a:
print(a) Обратите внимание, что теперь рядом с ключевым словом if у нас нет типичного выражения, там всего лишь одна переменная:
Удивительно, но на выходе получается 5.
Но если мы изменим значение a на ноль, вывода не будет:
>>> a = 0
>>> if a:
print(a) Переменная a не является типичным выражением. У нее нет операторов и операндов. Так почему же она оценивается как True или False в зависимости от ее значения?
Ответ кроется в концепции истинности и ложности значений.
В Python отдельные значения могут оцениваться как True или False. Они не обязательно должны быть частью большого выражения, чтобы получить истинностное значение, поскольку уже имеют его в соответствии с правилами языка Python.
Основные правила таковы:
Согласно документации Python, любой объект можно проверить на истинность, чтобы использовать его в качестве условия в if или while или в качестве операнда булевых операций and, or, not.
Когда мы используем значение как часть более крупного выражения или как условие в if или while, мы используем его в булевом контексте.
Булевым контекстом можно считать отдельную часть вашего кода, значение которой должно быть либо True, либо False.
Например, условие после ключевого слова if или после ключевого слова while должно иметь значение True или False:
Совет. Значение можно хранить в переменной. Мы можем написать имя переменной после ключевого слова if или while вместо самого значения. Это обеспечит ту же функциональность.
Теперь, когда вы знаете, что такое истинные и ложные значения и как они работают в булевом контексте, давайте разберем, какие значения в Python считаются истинными, а какие — ложными.
Последовательности и коллекции:
[](){}set()""range(0)Числа
00.00jКонстанты
Именно из-за ложности значения у нас не было вывода в нашем начальном примере, когда значение a было равно нулю. Значение 0 является ложным, поэтому условие if будет равно False и условие не будет выполняться:
>>> a = 0
>>> if a:
print(a)
# Вывода нет Согласно документации Python, по умолчанию объект считается истинным.
К истинным значениям относятся:
Поэтому в приведенном ранее примере, когда значение a было равно 5 (истинное значение), в выводе мы получили 5:
>>> a = 5
>>> if a:
print(a)
# Вывод:
# 5 Вы можете проверить, является ли значение истинным или ложным, с помощью встроенной функции bool().
Согласно документации Python, эта функция возвращает булево значение, то есть True или False. Аргумент преобразуется с помощью стандартной процедуры проверки на истинность.
Вам нужно только передать значение в качестве аргумента, например, так:
>>> bool(5)
True
>>> bool(0)
False
>>> bool([])
False
>>> bool({5, 5})
True
>>> bool(-5)
True
>>> bool(0.0)
False
>>> bool(None)
False
>>> bool(1)
True
>>> bool(range(0))
False
>>> bool(set())
False
>>> bool({5, 6, 2, 5})
True Совет. В качестве аргумента можно передать переменную. Так вы проверите, является ли ее значение истинным или ложным.
Использование истинных и ложных значений может помочь вам сделать ваш код более кратким и читабельным. Давайте разберем пару примеров.
У нас есть функция print_even(), которая принимает в качестве аргумента список или кортеж, содержащий числа, и печатает только четные значения. Если аргумент пуст, то печатается сообщение:
def print_even(data):
if len(data) > 0:
for value in data:
if value % 2 == 0:
print(value)
else:
print("The argument cannot be empty") Обратите внимание на эту строчку:
if len(data) > 0:
Мы можем сделать условие гораздо более лаконичным, используя концепцию истинности и ложности значений:
if data:
Если список или кортеж data пуст, он будет оцениваться как False. Если он не пуст, то значение будет равно True. Мы получим ту же функциональность с более лаконичным кодом.
В итоге наша функция будет выглядеть так:
def print_even(data):
if data:
for value in data:
if value % 2 == 0:
print(value)
else:
print("The argument cannot be empty") И еще один пример. Мы также можем использовать истинность и ложность значений, чтобы вызвать исключение (ошибку), когда аргумент, переданный в функцию, не является валидным.
>>> def print_even(data):
if not data:
raise ValueError("The argument data cannot be empty")
for value in data:
if value % 2 == 0:
print(value) В данном случае, используя not data в качестве условия в предложении if, мы получаем противоположное значение истинности data для условия if.
Давайте разберем not data более подробно.
Если объект data (список или кортеж) пуст:
data будет оцениваться как False.not data будет эквивалентно not False, что равно True.Если объект data не пуст:
not data будет эквивалентно not True, то есть False.Если вы знакомы с классами и объектно-ориентированным программированием, вы можете добавить специальный метод в ваши классы, чтобы заставить ваши объекты действовать как истинные и ложные значения.
С помощью специального метода __bool__() можно задать «настраиваемое» условие, которое будет определять, когда объект вашего класса будет оцениваться как True или False.
Согласно документации Python, по умолчанию объект считается истинным, если в его классе не определен метод __bool__(), который возвращает False, или метод __len__(), который возвращает ноль при вызове этого объекта.
Например, у нас есть очень простой класс:
>>> class Account:
def __init__(self, balance):
self.balance = balance Как видите, никаких специальных методов не определено, поэтому все объекты, которые вы создадите из этого класса, всегда будут оцениваться как True:
>>> account1 = Account(500) >>> bool(account1) True >>> account2 = Account(0) >>> bool(account2) True
Мы можем настроить это поведение, добавив специальный метод __bool__():
>>> class Account:
def __init__(self, balance):
self.balance = balance
def __bool__(self):
return self.balance > 0 Теперь, если баланс счета больше нуля, объект будет иметь значение True. В противном случае, если баланс счета равен нулю, объект будет иметь значение False.
>>> account1 = Account(500) >>> bool(account1) True >>> account2 = Account(0) >>> bool(account2) False
Совет. Если в классе не определен метод __bool__(), но определен метод __len__(), значение, возвращаемое этим методом, будет определять, является ли объект истинным или ложным.
Истинные значения — это значения, которые в булевом контексте оцениваются как True. Ложные значения — это значения, которые в булевом контексте оцениваются как False.
К ложным значениям относятся пустые последовательности (списки, кортежи, строки, словари, множества), ноль любого числового типа, None и False.
Истинные значения включают непустые последовательности, числа (кроме 0 любого числового типа) и практически все значения, которые не являются ложными.
Используя истинность и ложность значений, можно сделать свой код более лаконичным.
Перевод статьи “Truthy and Falsy Values in Python: A Detailed Introduction”.
Если вы ищете работу на Python, на Talanto.work сейчас есть варианты для junior, middle, senior…
Рынок Python-вакансий большой, но удобным его назвать сложно. Формально вакансий много, однако в реальном поиске…
Срезы в Python — это больше, чем a[2:7]. В статье — быстрый разбор полезных приёмов:…
В этой статье мы рассмотрим возведение в степень в Python с помощью различных методов, от…
Дубликаты в списке Python — частая проблема. В статье показано, как быстро убрать повторы, в…
Услуга виртуального хостинга на SpaceWeb позволяет арендовать часть сервера (shared-сервера) и разместить на нём свой…