Справочник по Python · модуль 3 · списки и циклы
Глава 3.16
Truthy и Falsy
значения
Условию в Python необязательно передавать готовый True или False. Числа, строки и коллекции тоже имеют логическую истинность, которую Python проверяет через bool().
- Категория
- Логические проверки
- Уровень
- Средний
- Связанные темы
- bool, if, while, коллекции
- Зачем это знать
- Проверять наличие данных без лишних сравнений
§1Логический контекст
if, while, not, and и or оценивают истинность полученного значения. Условие if value: принимает решение так, как если бы использовало bool(value).
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 — остальные значения, если их тип не определяет особое поведение. Отрицательное число истинно, непустая строка истинна, непустая коллекция истинна.
print(bool(-5)) print(bool("False")) print(bool([0]))
True True True
§4Проверка строки
Если важен сам факт наличия текста, строку можно проверять напрямую.
name = "Максим" if name: print("Имя указано") else: print("Имя пустое")
Строка из пробелов не пуста. Если пробелы нужно игнорировать, проверяйте if name.strip():.
§5Проверка коллекции
if items: означает «в коллекции есть элементы», а if not items: — «коллекция пуста».
numbers = [] if not numbers: print("Список пуст")
Список пуст
Такая запись точнее выражает намерение, чем len(numbers) > 0, когда нужна лишь проверка пустоты.
§6Где используется истинность
Одно правило работает во всех логических контекстах.
tasks = ["проверить", "сохранить"] while tasks: print(tasks.pop())
сохранить проверить
§7filter(None, ...)
filter(None, iterable) оставляет только истинные элементы. Он удалит не только None, но и нули, пустые строки и другие Falsy-значения.
data = [0, 1, 2, "", 3, None] print(list(filter(None, data)))
[1, 2, 3]
§8Когда нужен явный bool()
Внутри if преобразование уже происходит автоматически. bool(value) полезен, когда логический результат нужно сохранить, вывести или вернуть из функции.
message = "Готово" has_message = bool(message) print(has_message)
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: ясно выражают наличие или отсутствие данных.