Operadores lógicos com truthy e falsy
Como os operadores lógicos em Python interagem com valores truthy e falsy
Valores truthy e falsy
Na lição anterior, aprendemos sobre os operadores lógicos. Mas você se lembra que quando falamos sobre Booleanos, vimos que alguns valores são considerados como verdadeiros ou falsos para o Python, mesmo sem serem do tipo bool?
Agora vamos retomar essa ideia com mais clareza:
O que é valor truthy?
Os valores que vimos que são considerados como True são chamados de truthy. Lembre-se de alguns deles:
- Números diferentes de zero: 1, 2.5, -3
- Strings não vazias: "Python", "0"
- Coleções com pelo menos um elemento: [1], { "a": 1 }
O que é falsy?
Já os valores que são considerados como False são chamados de falsy. Reveja quais são:
- O número zero: 0
- String vazia: ""
- Coleções vazias ([], {}, ())
None
Existe um valor especial que ainda não vimos, o None. Ele representa a falta de um valor e é do tipo NoneType. Da mesma forma que podemos criar variáveis com strings vazias, também podemos criar variáveis sem valor nenhum atribuído usando o None:
1x = None 2 3print(x) 4print(type(x)) 5 6# Saída: 7# None 8# <class 'NoneType'>
Não precisa se preocupar com ele agora, basta saber que ele também é considerado como falsy.
1x = None 2print(bool(x)) 3 4# Saída: 5# False
Operadores lógicos com truthy e falsy
Agora que você já sabe que vários valores podem se comportar como True ou False, é importante entender como os operadores lógicos lidam com eles. O Python não converte automaticamente tudo para booleano. Na verdade, ele usa os valores truthy e falsy diretamente.
O and com valores truthy e falsy
O operador and retorna o primeiro valor falsy encontrado. Se todos forem truthy, retorna o último valor.
1print(0 and 5) # 0 é falsy 2print(3 and 7) # ambos são truthy 3 4# Saída: 5# 0 6# 7 7
Uma aplicação do and com valores truthy e falsy é quando queremos garantir que um arquivo existe E possui conteúdo antes de usá‑lo. Imagine que você está recebendo o nome de um arquivo e também o conteúdo dele. Só faz sentido processar o arquivo se ambos existirem:
1nome_arquivo = "relatorio.txt" # truthy 2conteudo_arquivo = "Dados do relatório" # truthy 3 4resultado = nome_arquivo and conteudo_arquivo 5print(resultado) 6 7# Saída: 8# Dados do relatório
Se qualquer dos valores for falsy (nome vazio e/ou conteúdo vazio), o and devolve esse valor, indicando que falta algo. Se ambos forem truthy, o and devolve o último valor: o conteúdo.
O or com valores truthy e falsy
O operador or retorna o primeiro valor truthy encontrado. Se todos forem falsy, retorna o último.
1print("" or "Python") # string vazia é falsy 2print(0 or 5) # 0 é falsy, 5 é truthy 3 4# Saída: 5# Python 6# 5
Esses comportamentos tornam expressões como esta muito naturais em Python:
1nome = input("Digite seu nome: ") or "Visitante" 2print(f"Olá, {nome}!")
Aqui, se o usuário não digitar nada, input retorna uma string vazia (falsy). O operador or então devolve "Visitante". Se o usuário digitar algo, esse valor (truthy) é retornado.
O not com valores truthy e falsy
Já o not continua invertendo o valor booleano do que vem depois dele. Se um valor é truthy, ele vira False. Se ele é falsy, vira True:
1texto = "" 2print(not texto) # string vazia é falsy 3 4# Saída: 5# True