Истинность значений в Python (truthy / falsy)

Истинность значений в Python (truthy / falsy)

В предыдущих уроках мы видели, что условие в if — это любое выражение, которое Python вычисляет как True или False. Но вы уже встречали случаи вроде if x: или x or "default", где проверяется не bool, а произвольное значение. Как Python решает, истинно оно или ложно? Для этого существует концепция truthy/falsy.

Что такое truthy и falsy

Python может преобразовать любое значение в булевый контекст — при необходимости вызывает bool() неявно. Значения, которые при этом дают False, называются falsy («ложными»); все остальные — truthy («истинными»).

Все falsy значения Python:

bool(False)    # False — очевидно
bool(None)     # False
bool(0)        # False — целый ноль
bool(0.0)      # False — дробный ноль
bool(0j)       # False — комплексный ноль (редко)
bool("")       # False — пустая строка
bool([])       # False — пустой список (модуль 5)
bool(())       # False — пустой кортеж (модуль 5)
bool({})       # False — пустой словарь (модуль 6)
bool(set())    # False — пустое множество (модуль 6)

Всё остальное — truthy:

bool(1)        # True — любое ненулевое число
bool(-42)      # True
bool(3.14)     # True
bool("hello")  # True — непустая строка
bool(" ")      # True — строка с пробелом (не пустая!)
bool([1, 2])   # True — непустой список
bool({"key": 1}) # True — непустой словарь

Практическое использование

Знание truthy/falsy позволяет писать более лаконичные условия.

Проверка «есть ли что-то в строке»:

name = input("Введите имя: ")

if name:          # то же что if name != ""
    print(f"Привет, {name}!")
else:
    print("Имя не введено")

Проверка «число ненулевое»:

divisor = int(input("Делитель: "))

if divisor:       # то же что if divisor != 0
    print(10 / divisor)
else:
    print("Деление на ноль!")

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

errors = []   # пустой список (мы изучим списки в модуле 5)

if not errors:    # то же что if len(errors) == 0
    print("Ошибок нет")

Значение по умолчанию через or

Помните из урока 2-3: or возвращает первый «истинный» операнд или последний, если все ложные? В сочетании с truthy/falsy это даёт элегантный способ задать значение по умолчанию:

username = ""
display = username or "Гость"   # username пустой (falsy) → берём "Гость"
print(display)   # Гость

username = "Алиса"
display = username or "Гость"   # username непустой (truthy) → берём его
print(display)   # Алиса

Этот паттерн очень распространён в Python-коде.

Ловушка: "False" и "0" истинны!

Строки "False" и "0" — это непустые строки, значит truthy:

print(bool("False"))   # True — непустая строка!
print(bool("0"))       # True — непустая строка!
print(bool(""))        # False — пустая строка

Это частая ловушка: если пользователь ввёл "False", это не то же самое, что Python-значение False. Если нужно сравнить с конкретным значением — используйте ==:

answer = input("Продолжить? (yes/no): ")
if answer == "yes":    # явное сравнение, не if answer:
    print("Продолжаем")

Сравнение: явная проверка vs truthy

Оба подхода рабочие, но каждый уместен в своей ситуации:

items = [1, 2, 3]   # список — к ним вернёмся в модуле 5

# Явная проверка:
if len(items) > 0:
    print("Список не пустой")

# Через truthy (более Pythonic):
if items:
    print("Список не пустой")

PEP 8 (официальный гайд по стилю) рекомендует второй вариант для проверки «есть ли что-то в коллекции».

Однако для явной проверки на None используйте is None, а не truthy-проверку:

value = 0   # это ноль, не None!

# Неправильно, если хотим проверить именно None:
if not value:         # True и для None, и для 0, и для ""
    print("значение отсутствует или ноль")

# Правильно:
if value is None:     # True только для None
    print("значение не задано")

Функция bool() явно

Иногда полезно явно преобразовать значение в bool, чтобы получить чистый True/False:

x = 42
flag = bool(x)
print(flag)    # True

y = 0
flag2 = bool(y)
print(flag2)   # False

Это особенно полезно при логировании или отладке: вы видите True/False вместо произвольного значения.

Проверь себя

Что выведет каждая из строк?

print(bool(0))
print(bool("0"))
print(bool([]))
print(bool(" "))
  • bool(0)False (ноль)
  • bool("0")True (непустая строка)
  • bool([])False (пустой список)
  • bool(" ")True (строка с пробелом, не пустая)

Итог

  • Python неявно приводит любое значение к bool в условном контексте.
  • Falsy: False, None, 0, 0.0, "", [], (), {}, пустые коллекции.
  • Truthy: всё остальное, включая "False", "0", непустые строки и коллекции.
  • if x: — проверка «х истинен»; удобна для строк и коллекций, но не для явной проверки на None.
  • x or default — классический паттерн «значение по умолчанию».
  • Для проверки на None используйте is None; не полагайтесь на truthy.

В следующем уроке познакомимся с конструкцией match/case — современным способом сопоставления значений по шаблонам, появившимся в Python 3.10.

Попробуйте интерактивную версию

Практические задачи, квизы и AI-наставник — бесплатный старт без карты

Перейти к практике