Python fornece operadores lógicos para realizar operações lógicas (Booleanas).(and
,or
,not
)
É utilizado para descrever a relação entre múltiplas condições numa declaração de if.
Esta secção descreve o seguinte.
- intersecção:
and
- adição lógica:
or
- negação:
not
and
,or
,not
Precedência do operador
Além disso, os seguintes pontos são explicados como cautelas.
- Operadores lógicos para objectos de tipo diferente de bool
and
,or
Estes valores de retorno não são necessariamente do tipo bool.- Curto-circuito (avaliação de curto-circuito)
intersecção: and
e devolve o produto lógico de dois valores.
print(True and True)
# True
print(True and False)
# False
print(False and True)
# False
print(False and False)
# False
De facto, é frequentemente utilizado não para verdadeiro ou falso, mas para expressões condicionais utilizando operadores de comparação. Para sua informação, os operadores de comparação são os seguintes.
<
>
a = 10
print(0 < a)
# True
print(a < 100)
# True
print(0 < a and a < 100)
# True
e pode ser concatenada da seguinte forma.
print(0 < a < 100)
# True
adição lógica: or
ou devolve o OU lógico dos dois valores.
print(True or True)
# True
print(True or False)
# True
print(False or True)
# True
print(False or False)
# False
negação: not
não” retorna a negação do valor; verdadeiro e falso são invertidos.
print(not True)
# False
print(not False)
# True
and,or,notPrecedência do operador
A ordem de precedência destes operadores lógicos é a seguinte: não é a mais alta.
not
and
or
No seguinte código de amostra, a expressão acima é interpretada como se fosse a que se segue. Uma vez que não há problema com parênteses extra, pode ser mais fácil descrevê-los claramente em casos como este exemplo.
print(True or True and False)
# True
print(True or (True and False))
# True
Se quiser operar ou antes e, use parênteses().
print((True or True) and False)
# False
<
,>
Estes operadores de comparação têm uma precedência ainda maior do que não. Por conseguinte, não são necessários parênteses para cada operação de comparação, como foi o caso no exemplo acima.
print(0 < a and a < 100)
# True
Ver a documentação oficial abaixo para um resumo da precedência do operador em Python.
Operadores lógicos para objectos de tipo diferente de bool
Com estes operadores lógicos, não só os tipos de bool (verdadeiro, falso), mas também números, cordas, listas, etc., são processados como valores booleanos.
Os seguintes objectos são considerados falsos nas operações lógicas da Python.
- Constantes definidas para serem falsas:
None
,false
- Zero em tipos numéricos:
0
,0
,0j
,Decimal(0)
,Fraction(0, 1)
- Sequência ou colecção vazia:
''
,()
,[]
,{}
,set()
,range(0)
Todos os outros valores são considerados verdadeiros.
A função bool() pode ser usada para obter o valor booleano de um objecto. Note-se que a string '0' ou 'Falso' é considerada verdadeira.
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
Para manusear '0' ou 'falso' numa corda como falso, usar distutils.util.strtobool().
and,orEstes valores de retorno não são necessariamente do tipo bool.
Aqui está um exemplo de um objecto que não é do tipo bool, mostrando o resultado de cada operador sobre um valor numérico.
x = 10 # True
y = 0 # False
print(x and y)
# 0
print(x or y)
# 10
print(not x)
# False
Como pode ver pelo exemplo acima, e e ou em Python não devolvem verdadeiro ou falso do tipo bool, mas devolvem o valor à esquerda ou à direita, dependendo se é verdadeiro ou falso. O exemplo é numérico, mas o mesmo se aplica a outros tipos, tais como strings e listas. A propósito, não retorna verdadeiro ou falso do tipo bool.
As definições dos valores de retorno de e e ou são as seguintes.
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
Quando os valores das expressões da esquerda e da direita são verdadeiros e falsos separadamente, os valores de retorno são fáceis de compreender. Por outro lado, se ambos forem verdadeiros ou falsos, o valor de retorno será diferente dependendo da ordem.
Se o utilizar como uma expressão condicional numa declaração de if, etc., o resultado é julgado como um valor booleano e processado, pelo que não precisa de se preocupar com isso, mas se utilizar o valor de retorno para processamento posterior, precisa de ter cuidado.
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
Se quiser tratá-lo como verdadeiro ou falso, pode fazer como no último exemplo.bool(x and y)
Os valores de retorno de e e ou estão resumidos na tabela abaixo.
x | y | x and y | x or y |
---|---|---|---|
true | false | y | x |
false | true | x | y |
true | true | y | x |
false | false | x | y |
Curto-circuito (avaliação de curto-circuito)
Como pode ver na tabela acima, se x for falso em x e y, ou se x for verdadeiro em x ou y, o valor de retorno será x independentemente do valor de y.
Em tal caso, y não é avaliado.
and
,or
Note que se chamar uma função ou método do lado direito destes processos para fazer algum processamento, o processo pode não ser executado dependendo do resultado do lado esquerdo.
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