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.
- No programa completo, troque somente
amount = 8000poramount = 10000. A primeira condição ainda deve mostrarTrue. Com10001, ela deve mostrarFalse. A segunda condição continua verdadeira nos dois casos, pois testa outra regra. - Restaure
amount = 8000e troquecategory = "food"porcategory = "". A segunda linha passa a serFalse, enot categorypassa a serTrue. - 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.




