Истинность значений в 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.