Boolean Objects¶
Booleans in Python are implemented as a subclass of integers. There are only two booleans, Py_False and Py_True . As such, the normal creation and deletion functions don’t apply to booleans. The following macros are available, however.
This instance of PyTypeObject represents the Python boolean type; it is the same object as bool in the Python layer.
int PyBool_Check ( PyObject * o ) ¶
Return true if o is of type PyBool_Type . This function always succeeds.
The Python False object. This object has no methods and is immortal.
Changed in version 3.12: Py_False is immortal.
The Python True object. This object has no methods and is immortal.
Changed in version 3.12: Py_True is immortal.
Py_RETURN_FALSE ¶
Return Py_False from a function.
Return Py_True from a function.
PyObject * PyBool_FromLong ( long v ) ¶
Return value: New reference. Part of the Stable ABI .
Return Py_True or Py_False , depending on the truth value of v.
Python: Логический тип
Языки программирования адаптировали все математические операции сравнения в неизменном виде, кроме операторов равенства и неравенства. В математике для этого используется обычное равно = , но в программировании такое встречается редко.
Во многих языках символ = используется, чтобы присвоить переменным значения. Поэтому в Python сравнивают с помощью == .
Список операций сравнения:
Эти операции применяются не только к числам. Например, с помощью оператора равенства можно сравнить строки: password == text — это сравнение идентичности строк, которые записаны в разных переменных.
Логическая операция типа 5 > 4 или password == text — это выражение. Его результат — специальное значение True («истина») или False («ложь»). Это новый для нас тип данных — bool .
result = 5 > 4 print(result) # => True print('one' != 'one') # => False
Наряду со строками ( str ) и целыми и рациональными числами, тип bool (булев) — это один из примитивных типов данных в Python.
Попробуем написать простую функцию, которая принимает на вход возраст ребенка и определяет, младенец ли он. Младенцами считаются дети до года:
def is_infant(age): return age < 1 print(is_infant(3)) # =>False
Любая операция — это выражение, поэтому единственной строчкой функции пишем «вернуть то значение, которое получится в результате сравнения age < 1 ». В зависимости от того, какой аргумент пришел, сравнение будет истинным ( True ) или ложным ( False ), а return вернет этот результат.
А теперь проверим ребенка, которому полгода:
print(is_infant(0.5)) # => True
Результат операции True . Значит, ребенок действительно младенец.
Задание
Напишите функцию is_pensioner() , которая принимает возраст в качестве единственного аргумента и проверяет, является ли этот возраст пенсионным. Пенсионным считается возраст 60 лет и больше.
is_pensioner(75) # True is_pensioner(18) # False
Упражнение не проходит проверку — что делать?
Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:
- Обязательно приложите вывод тестов, без него практически невозможно понять что не так, даже если вы покажете свой код. Программисты плохо исполняют код в голове, но по полученной ошибке почти всегда понятно, куда смотреть.
В моей среде код работает, а здесь нет
Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.
Мой код отличается от решения учителя
Это нормально , в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.
В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.
Прочитал урок — ничего не понятно
Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.
Кстати, вы тоже можете участвовать в улучшении курсов: внизу есть ссылка на исходный код уроков, который можно править прямо из браузера.
Полезное
Определения
- Логический тип (bool) — тип данных с двумя возможными значениями: True (истина) и False (ложь).
What is the practical application of bool() in Python?
When it is being used in everyday coding? I am learning Python using this tutorial. What am I referring to is described here (middle of the page), but I can’t get it. I understand the principles of using True and False, but I don’t get when (or do) we actually use the bool() function in practice while writing our code. It would help me if you give the everyday, practical example of bool() in code.
Muhamed Huseinbašić
asked Jul 21, 2014 at 14:48
Muhamed Huseinbašić Muhamed Huseinbašić
562 3 3 gold badges 7 7 silver badges 26 26 bronze badges
Check the docs. docs.python.org/3/library/functions.html#bool
Jul 21, 2014 at 14:50
It lets you convert any Python value to a boolean value. What part about this is unclear?
Jul 21, 2014 at 14:51
Thanks to bool you can do stuff like if some_list: instead of if len(some_list) > 0: or if foo instead of if foo != None: where it is used implicitly according to there rules
Jul 21, 2014 at 14:51
I have already, but I still don’t get it. Can you give me an example?
Jul 21, 2014 at 14:51
@MuhamedHuseinbašić Personally, I can’t remenber ever using it. It is more used internally, in conditions and such where a boolean is expected, calling an objects __bool__ magic method.
Jul 21, 2014 at 14:54
4 Answers 4
It lets you convert any Python value to a boolean value.
Sometimes you want to store either True or False depending on another Python object. Instead of:
if python_object: result = True else: result = False
result = bool(python_object)
How Python objects are converted to a boolean value, all depends on their truth value. Generally speaking, None , numeric 0 and empty containers (empty list, dictionary, set, tuple, string, etc.) are all False , the rest is True .
You use it whenever you need an explicit boolean value. Say you are building an object tree, and you want to include a method that returns True if there are children in the tree:
class Tree(object): def __init__(self, children): self.children = children def has_children(self): return bool(self.children)
Now Tree().has_children() will return True when self.children is not empty, False otherwise.
29k 9 9 gold badges 73 73 silver badges 102 102 bronze badges
answered Jul 21, 2014 at 14:52
Martijn Pieters ♦ Martijn Pieters
1.1m 303 303 gold badges 4090 4090 silver badges 3365 3365 bronze badges
To understand what bool() does we need to first understand the concept of a boolean.
A boolean variable is represented by either a 0 or 1 in binary in most programming languages. A 1 represents a «True» and a 0 represents a «False»
The number 1 is different from a boolean value of True in some respects. For example, take the following code:
>>> 1 is True False
Notice that 1 is different than True according to Python. However:
>>> bool(1) is True True
When we use the bool() function here, we convert 1 to a boolean. This conversion is called «casting». Casting 1 to boolean returns the value of «True».
Most objects can be cast to a boolean value. From my experience, you should expect every standard object to evaluate to True unless it is 0, None, False or an empty iterable (for example: «», [], or <>). So as an example:
>>> bool(<>) False >>> bool() True >>> bool(None) False >>> bool("") False >>> bool("hello") True >>> bool(500) True >>> bool(0) False >>> bool(False) False >>> bool(-1) True
Lastly, a boolean prints as either «True» or «False»
>>> print bool(1) True
answered Jul 21, 2014 at 15:51
mgoldwasser mgoldwasser
14.7k 15 15 gold badges 79 79 silver badges 104 104 bronze badges
Note that bool is a subclass of int , so True and False can be used in arithmetic contexts.
Nov 4, 2019 at 23:31
Worth including that bool(-1) is True .
Jan 21, 2020 at 14:49
@psilocybin — thanks, edited to reflect that case as well
Jan 29, 2020 at 14:37
bool exposes the fact that Python allows for boolean conversions to things that you wouldn’t typically consider to be True or False.
An example of this is lists. If len(my_list) would be greater than 0, it also treats this as True . If it has no length — if len() would return 0 — it is False . This lets you write code like this:
def check_list_for_values(my_list, value): return [x for x in my_list if x == value] your_list = [5, 6, 7, 8, 9, 5, 3, 4, 8] if check_list_for_values(3, your_list): print "got a match"
If check_list_for_values returns a list that has length greater than 0, then it prints «got a match» because it evaluates to True . If there is no length to the list that would be returned.
your_list = [5, 6, 7, 8, 9, 5, 3, 4, 8] if check_list_for_values('elephant', your_list): print "got a match"
Then there will be nothing printed, because it evaluates to False .
Используем объекты вместо True и False — truthy и falsy значения в Python
Рассказываем про ложные и истинные значения, что их делает таковыми и как, используя истинные значения, можно сократить код.
Автор перевода Алексей Морозов
Значения вместо булевых переменных
В Python, как и в других языках, есть логический тип переменных bool, который имеет всего два значения: True (истина) и False (ложь). Его возвращают логические операторы (например сравнение чисел или проверка присутствия элемента в списке), и именно этот тип обычно используется в if и while. Тем не менее, явно использовать bool или операторы необязательно: существуют правила, по которым значение любого типа приводится к True или False.
Прим. пер. По-английски это называется truthy и falsy, то есть «примерно-но-не-совсем-истинные», «истинноватые» значения. Общепринятого русского перевода нет, но в этой статье под истинным или ложным значением объекта всегда подразумеваются именно эти штуки, а булевы значения везде названы True и False.
Вот как это работает:
>>> a = 5 >>> if a: print(a) # Вывод 5 >>> a = 0 >>> if a: print(a) # Ничего не выводится
Булев контекст
Любое значение в Python при необходимости может интерпретироваться как True или False в соответствии с правилами языка. Об этом написано и в документации:
Любой объект может быть протестирован на истинность и использован в условиях if и while, а также как операнд булевых операций (and, or, not).
Если объект используется таким образом, то он находится в булевом контексте. Грубо говоря, это такое место в коде, которое требует от объекта значения либо True, либо False.
В булевом контексте может использоваться как переменная, так и выражение. Если используется выражение, значит, оценивается истинность его результата.
Объекты, которые приравниваются к False
Любой объект, для которого определен метод __len__ , возвращающий для этого объекта 0, является falsy. Документация:
По умолчанию объект считается истинным, если его класс не определяет метод __bool__, возвращающий для объекта False, или метод __len__, возвращающий для него ноль.
Последовательности и коллекции
- пустой список: [];
- пустой кортеж: ();
- пустой словарь: <>;
- пустое множество: set();
- пустая строка: “”;
- пустой диапазон: range(0).
Нули любых численных типов
- целочисленный ноль: 0;
- ноль с плавающей точкой: 0.0;
- комплексный ноль: 0j.
Константы
Объекты, которые приравниваются к True
По умолчанию любой объект имеет истинное значение.
В частности, истинными являются:
- все непустые последовательности и коллекции (списки, кортежи, словари, множества, диапазоны и строки);
- все ненулевые числа;
- True.
Функция bool()
С помощью этой функции можно проверить истинность или ложность любого значения. Согласно документации, она:
Возвращает булево значение, т. е. либо True, либо False. Аргумент x конвертируется с использованием стандартной процедуры проверки истинности.
>> bool(5) True >>> bool(0) False
Передавать этой функции можно как значение, так и содержащую его переменную.
Зачем это нужно?
Преимущество истинных и ложных значений в том, что они позволяют сделать код кратким и понятным. Вот два примера:
Пример 1, с сообщением об ошибке
Допустим, у нас есть функция print_even(), которая принимает в качестве аргумента список или кортеж чисел и печатает его чётные элементы. Если список пустой, то выводится сообщение:
def print_even(data): if len(data) > 0: for value in data: if value % 2 == 0: print(value) else: print("Пустой список в аргументе")
Обратите внимание на эту строчку:
if len(data) > 0:
Её можно сократить до:
if data:
Если список пустой, data имеет ложное значение. Если он не пустой (то есть его длина больше нуля), то истинное. Тот же результат достигается меньшим количеством кода:
def print_even(data): if data: for value in data: if value % 2 == 0: print(value) else: print("Пустой список в аргументе")
Пример 2, с исключением
Можно использовать истинные/ложные значения, чтобы выбросить исключение, если аргумент некорректен.
>>> 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)
Если список data пустой:
- data имеет ложное значение, эквивалентное False;
- поэтому not data эквивалентно not False, то есть True;
- поэтому условие if истинно;
- поэтому бросается исключение.
Если список не пустой:
- data имеет истинное значение, эквивалентное True;
- поэтому not data эквивалентно not True, то есть False;
- поэтому условие if ложно;
- поэтому исключение не бросается.
Истинные и ложные значения произвольных объектов
Если вы хотите, чтобы у ваших объектов были не только истинные значения, можно добавить к классу метод __bool__() и задать в нём правила, по которым будет определяться истинность или ложность объекта.
Например, у нас есть вот такой класс:
>>> class Account: def __init__(self, balance): self.balance = balance
Поскольку у него нет специальных методов, все объекты этого класса имеют истинное значение:
>>> 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
Теперь объект имеет истинное значение, пока на счету больше нуля. При нулевом или отрицательном балансе значение будет ложным.
>>> account1 = Account(500) >>> bool(account1) True >>> account2 = Account(0) >>> bool(account2) False
Если у класса нет метода __bool__(), но есть метод __len__(), то истинность объекта определяется истинностью того, что возвращает __len__().
Вот так работает механизм, позволяющий использовать любые объекты в качестве булевых. С его помощью можно сделать код проще и понятнее; важно только не забывать осмысленно называть переменные — какое-нибудь pabotat() if cnucok_2 else He_pabotat() никуда не годится что с булевским контекстом, что без него.
