Модуль 3 · Списки и циклы

Справочник по Python · модуль 3 · списки и циклы

Глава 3.16

3.16

Truthy и Falsy
значения

Условию в Python необязательно передавать готовый True или False. Числа, строки и коллекции тоже имеют логическую истинность, которую Python проверяет через bool().

Категория
Логические проверки
Уровень
Средний
Связанные темы
bool, if, while, коллекции
Зачем это знать
Проверять наличие данных без лишних сравнений

§1Логический контекст

if, while, not, and и or оценивают истинность полученного значения. Условие if value: принимает решение так, как если бы использовало bool(value).

main.pyодно правило для разных типов
values = [0, 7, "", "Python", [], [1]]
for value in values:
    print(bool(value))
Выводлогическая истинность
False
True
False
True
False
True

§2Какие значения считаются Falsy

Falsy — значения, которые становятся False в логическом контексте.

ГруппаПримеры
логическое и отсутствие значенияFalse, None
числовой ноль0, 0.0, 0j
пустые последовательности"", [], (), range(0)
пустые отображения и множества{}, set()

Ноль внутри непустой коллекции не делает саму коллекцию ложной: bool([0]) равно True, потому что в списке есть элемент.

§3Какие значения считаются Truthy

Truthy — остальные значения, если их тип не определяет особое поведение. Отрицательное число истинно, непустая строка истинна, непустая коллекция истинна.

main.pyзначение не обязано равняться True
print(bool(-5))
print(bool("False"))
print(bool([0]))
Выводвсе три значения истинны
True
True
True

§4Проверка строки

Если важен сам факт наличия текста, строку можно проверять напрямую.

main.pyнепустое имя
name = "Максим"
if name:
    print("Имя указано")
else:
    print("Имя пустое")

Строка из пробелов не пуста. Если пробелы нужно игнорировать, проверяйте if name.strip():.

§5Проверка коллекции

if items: означает «в коллекции есть элементы», а if not items: — «коллекция пуста».

main.pyпустой список
numbers = []
if not numbers:
    print("Список пуст")
Выводэлементов нет
Список пуст

Такая запись точнее выражает намерение, чем len(numbers) > 0, когда нужна лишь проверка пустоты.

§6Где используется истинность

Одно правило работает во всех логических контекстах.

main.pyцикл до опустошения
tasks = ["проверить", "сохранить"]
while tasks:
    print(tasks.pop())
Выводцикл остановился на пустом списке
сохранить
проверить

§7filter(None, ...)

filter(None, iterable) оставляет только истинные элементы. Он удалит не только None, но и нули, пустые строки и другие Falsy-значения.

main.pyоставляем истинные элементы
data = [0, 1, 2, "", 3, None]
print(list(filter(None, data)))
Выводнули тоже удалены
[1, 2, 3]

§8Когда нужен явный bool()

Внутри if преобразование уже происходит автоматически. bool(value) полезен, когда логический результат нужно сохранить, вывести или вернуть из функции.

main.pyсохраняем результат проверки
message = "Готово"
has_message = bool(message)
print(has_message)
Выводтип bool
True

§9Частые ошибки

Что написаноЧто произойдётКак правильно
if value == Trueпроверяется равенство, хотя обычно нужна истинностьif value:
if len(items) > 0работает, но перегружает проверку наличия элементовif items:
bool("False") считают ложнымполучится True: строка не пустасравнить содержимое строки явно
bool([0]) считают ложнымполучится True: в списке один элементразличать истинность списка и его элементов
filter(None, values) используют только для удаления Noneтакже исчезнут 0, False и пустые значениядля удаления только None задать точное условие

§10Проверьте себя

Почему bool([0]) возвращает True?

Список не пуст: его единственный элемент не влияет на истинность самого списка.

Чем отличаются if items: и if len(items) > 0:?

Для обычной коллекции результат одинаков, но первая запись напрямую выражает проверку непустоты.

Пуста ли строка " "?

Нет, в ней есть пробел. Для проверки текста без окружающих пробелов используйте value.strip().

§11Шпаргалка

Есть значениеif value:
Значения нетif not value:
Явное преобразованиеbool(value)
Только истинныеfilter(None, values)

Итог главы

Python оценивает истинность любого значения в логическом контексте. Ноль, None и пустые коллекции считаются Falsy; непустые коллекции и ненулевые числа — Truthy. Прямые проверки if items: и if not items: ясно выражают наличие или отсутствие данных.

Глава 3.16 · Truthy и Falsy · Справочник по PythonАвтор: Макаров Максим Николаевич