Python предоставляет логические операторы для выполнения логических (булевых) операций.(and
,or
,not
)
Он используется для описания взаимосвязи между несколькими условиями в операторе if.
В этом разделе описано следующее.
- перекресток:
and
- логическое дополнение:
or
- отказ:
not
and
,or
,not
Старшинство операторов
Кроме того, следующие моменты объясняются как предостережения.
- Логические операторы для объектов типа, отличного от bool
and
,or
Эти возвращаемые значения не обязательно имеют тип bool.- Короткое замыкание (оценка короткого замыкания)
перекресток: and
и возвращает логическое произведение двух значений.
print(True and True)
# True
print(True and False)
# False
print(False and True)
# False
print(False and False)
# False
На самом деле, он часто используется не для true или false, а для условных выражений с использованием операторов сравнения. Для справки, операторы сравнения выглядят следующим образом.
<
>
a = 10
print(0 < a)
# True
print(a < 100)
# True
print(0 < a and a < 100)
# True
и могут быть конкатенированы следующим образом.
print(0 < a < 100)
# True
логическое дополнение: or
или возвращает логическое ИЛИ двух значений.
print(True or True)
# True
print(True or False)
# True
print(False or True)
# True
print(False or False)
# False
отказ: not
not» возвращает отрицание значения; true и false меняются местами.
print(not True)
# False
print(not False)
# True
and,or,notСтаршинство операторов
Порядок старшинства этих логических операторов следующий: not — наивысший.
not
and
or
В следующем примере кода приведенное выше выражение интерпретируется так, как если бы это было выражение, приведенное ниже. Поскольку нет никакой проблемы с лишними круглыми скобками, может быть проще четко описать их в случаях, подобных этому примеру.
print(True or True and False)
# True
print(True or (True and False))
# True
Если вы хотите использовать операцию or перед and, используйте круглые скобки().
print((True or True) and False)
# False
<
,>
Эти операторы сравнения имеют даже больший приоритет, чем not. Поэтому для каждой операции сравнения не обязательно использовать круглые скобки, как это было в приведенном выше примере.
print(0 < a and a < 100)
# True
Краткое описание старшинства операторов в Python см. в официальной документации ниже.
Логические операторы для объектов типа, отличного от bool
С помощью этих логических операторов в качестве булевых значений обрабатываются не только типы bool (true, false), но и числа, строки, списки и т.д.
Следующие объекты считаются ложными в логических операциях Python.
- Константы, определенные как false:
None
,false
- Обнуление в числовых типах:
0
,0
,0j
,Decimal(0)
,Fraction(0, 1)
- Пустая последовательность или коллекция:
''
,()
,[]
,{}
,set()
,range(0)
Все остальные значения считаются истинными.
Функция bool() может быть использована для получения булева значения объекта. Обратите внимание, что строка '0' или 'False' считается истиной.
print(bool(10))
# True
print(bool(0))
# False
print(bool(''))
# False
print(bool('0'))
# True
print(bool('False'))
# True
print(bool([]))
# False
print(bool([False]))
# True
Чтобы считать '0' или 'false' в строке ложью, используйте distutils.util.strtobool().
and,orЭти возвращаемые значения не обязательно имеют тип bool.
Вот пример объекта, отличного от типа bool, показывающий результат работы каждого оператора над числовым значением.
x = 10 # True
y = 0 # False
print(x and y)
# 0
print(x or y)
# 10
print(not x)
# False
Как видно из приведенного примера, and и or в Python не возвращают true или false типа bool, а возвращают значение слева или справа в зависимости от того, true оно или false. Пример относится к числовым типам, но то же самое применимо и к другим типам, таким как строки и списки. Кстати, not возвращает true или false типа bool.
Определения возвращаемых значений and и or следующие.
The expression x and y first evaluates x; if x is false, its value is returned; otherwise, y is evaluated and the resulting value is returned.
The expression x or y first evaluates x; if x is true, its value is returned; otherwise, y is evaluated and the resulting value is returned.
6.11. Boolean operations — Expressions — Python 3.10.1 Documentation
Когда значения левого и правого выражений по отдельности являются true и false, возвращаемые значения легко понять. С другой стороны, если оба выражения истинны или оба ложны, возвращаемое значение будет различным в зависимости от порядка.
Если вы используете его в качестве условного выражения в операторе if и т.д., результат будет считаться булевым значением и обрабатываться, поэтому вам не нужно беспокоиться об этом, но если вы используете возвращаемое значение для дальнейшей обработки, вам нужно быть осторожным.
x = 10 # True
y = 100 # True
print(x and y)
# 100
print(y and x)
# 10
print(x or y)
# 10
print(y or x)
# 100
x = 0 # False
y = 0.0 # False
print(x and y)
# 0
print(y and x)
# 0.0
print(x or y)
# 0.0
print(y or x)
# 0
print(bool(x and y))
# False
Если вы хотите рассматривать его как true или false, вы можете сделать так, как в последнем примере.bool(x and y)
Возвращаемые значения and и or приведены в таблице ниже.
x | y | x and y | x or y |
---|---|---|---|
true | false | y | x |
false | true | x | y |
true | true | y | x |
false | false | x | y |
Короткое замыкание (оценка короткого замыкания)
Как видно из приведенной выше таблицы, если x ложно в x и y, или если x истинно в x или y, возвращаемое значение будет x, независимо от значения y.
В этом случае y не оценивается.
and
,or
Обратите внимание, что если вы вызываете функцию или метод в правой части этих процессов для выполнения некоторой обработки, процесс может не выполняться в зависимости от результата в левой части.
def test():
print('function is called')
return True
print(True and test())
# function is called
# True
print(False and test())
# False
print(True or test())
# True
print(False or test())
# function is called
# True