Curso de Python / Comparações, operadores lógicos e valores de verdade

Operadores de comparação testam relações entre valores, e operadores lógicos combinam condições. Em Python, and e or podem devolver um dos operandos, e não apenas True ou False; diferencie o teste de uma condição da escolha de um valor padrão.

Diferencie igualdade, atribuição e identidade

Use == para comparar valores, = para atribuir e != para testar diferença. Os operadores <, >, <= e >= comparam relações de ordem. Antes de comparar entradas, confira os tipos: uma string que contém dígitos ainda não é um número.

Uma comparação encadeada como 0 <= amount <= 10000 inclui os dois limites. Já 0 < amount <= 10000, usada no programa desta aula, exclui zero e inclui dez mil. Escolher < ou <= faz parte da regra dos dados, não de uma preferência de estilo. A referência de comparações descreve o encadeamento.

None representa a ausência de um valor e normalmente é testado com is None. is testa se os dois lados são o mesmo objeto; == testa igualdade de valor. Duas listas criadas separadamente podem ter conteúdo igual sem ser o mesmo objeto. Não use identidade para decidir se os elementos de duas listas são iguais.

Execute comparações e expressões de valor padrão

Salve o programa completo abaixo em UTF-8 como conditions.py, na pasta do projeto, e execute python conditions.py no ambiente selecionado. No macOS ou Ubuntu, fora de um ambiente virtual, use python3 se esse for o comando da instalação. Não são necessários pacotes adicionais nem arquivos de entrada.

amount = 8000
category = "food"
print(0 < amount <= 10000)
print(amount > 5000 and category == "food")
print(not category)
print("" or "unknown")
print(0 or 100)
print([] == [], [] is [])

A saída esperada é:

True
True
False
unknown
100
True False

A primeira linha confirma que 8000 está no intervalo escolhido. A segunda exige simultaneamente um valor maior que 5000 e a categoria food. A terceira inverte o resultado do teste de verdade de uma string não vazia, produzindo False. As duas linhas seguintes escolhem operandos de expressões com or.

A última linha cria duas listas distintas em cada comparação: os conteúdos vazios são iguais, mas os objetos não são idênticos. Por isso o resultado é True False, e não duas respostas iguais.

Entenda o valor de verdade e o curto-circuito

Strings vazias, coleções vazias, zero e None são falsos em um teste de condição. Uma string não vazia como "False" é verdadeira, mesmo que sua palavra signifique falso. Portanto, bool("False") não interpreta um texto de configuração como um valor booleano. Para dados externos, defina quais textos são aceitos e como serão convertidos.

and não avalia a expressão à direita se o operando à esquerda for falso. or não avalia a expressão à direita se o operando à esquerda for verdadeiro. Esse comportamento se chama avaliação de curto-circuito. Quando precisam escolher um resultado, esses operadores devolvem o próprio operando selecionado; not, por sua vez, devolve um booleano. A referência das operações booleanas apresenta essas regras.

Isso explica os resultados unknown e 100: a string vazia e o zero são falsos, então or seleciona o lado direito. Para observar também a execução, experimente print(False and print("called")). Somente False é mostrado; a chamada que mostraria called não acontece.

De modo semelhante, False and check() e True or check() não chamam check. Não coloque uma validação ou gravação obrigatória apenas no lado de uma expressão que pode não ser executado. Se a operação precisa acontecer sempre, expresse essa etapa de maneira independente.

Preserve zero e valores vazios quando forem válidos

amount or 100 escolhe 100 quando amount é zero. Se zero for um dado válido e somente None indicar ausência, escreva 100 if amount is None else amount. Nesse caso, zero continua sendo zero. Uma forma abreviada não deve mudar silenciosamente a regra de dados.

  1. No programa completo, troque somente amount = 8000 por amount = 10000. A primeira condição ainda deve mostrar True. Com 10001, ela deve mostrar False. A segunda condição continua verdadeira nos dois casos, pois testa outra regra.
  2. Restaure amount = 8000 e troque category = "food" por category = "". A segunda linha passa a ser False, e not category passa a ser True.
  3. Restaure a categoria e confira novamente as seis linhas originais. Teste também zero se ele for um limite importante: a primeira condição do programa o rejeita explicitamente.

Na aula de dicionários e valores ausentes, uma chave inexistente e uma chave cujo valor é None também exigem decisões diferentes. Defina o significado de ausência, zero e vazio antes de escolher uma expressão lógica para tratá-los.