Os operadores lógicos de Python e, ou, e não (conjunção lógica, disjunção, negação)

O negócio

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,notPrecedê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,orEstes 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.

  1. not
  2. and
  3. 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.

xyx and yx or y
truefalseyx
falsetruexy
truetrueyx
falsefalsexy

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,orNote 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