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
Ако искате да използвате или пред и, използвайте скоби().
print((True or True) and False)
# False
<
,>
Тези оператори за сравнение имат дори по-висок приоритет от останалите. Затова не са необходими скоби за всяка операция за сравнение, както беше в примера по-горе.
print(0 < a and a < 100)
# True
Вижте официалната документация по-долу за обобщение на предимството на операторите в Python.
Логически оператори за обекти от тип, различен от bool
С тези логически оператори не само типове bool (true, false), но и числа, низове, списъци и т.н. се обработват като булеви стойности.
Следните обекти се считат за false в логическите операции на Python.
- Константи, дефинирани да бъдат false:
None
,false
- Нула в числовите типове:
0
,0
,0j
,Decimal(0)
,Fraction(0, 1)
- Празна последователност или колекция:
''
,()
,[]
,{}
,set()
,range(0)
Всички други стойности се считат за верни.
Функцията bool() може да се използва за получаване на булева стойност на обект. Имайте предвид, че символът '0' или 'False' се счита за true.
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' в низ като 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
Както можете да видите от примера по-горе, и и или в Python не връщат true или false от тип bool, а връщат стойността отляво или отдясно в зависимост от това дали е true или false. Примерът е за числови типове, но същото важи и за други типове, като например низове и списъци. Между другото, not връща true или false от тип bool.
Дефинициите на връщаните стойности на и и или са следните.
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 поотделно, връщаните стойности са лесни за разбиране. От друга страна, ако и двете са 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)
Стойностите на връщане на и и или са обобщени в таблицата по-долу.
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 е false в x и y или ако x е true в 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