Python Booleanos (True e False)
Muitas perguntas que um programa faz têm só duas respostas possíveis: a padaria está aberta? Ainda tem pão? A aluna passou de ano? A senha está certa? Para guardar essas respostas, o Python tem um tipo próprio, o bool (os booleanos), com apenas dois valores: True (verdadeiro) e False (falso). Eles parecem simples, e são, mas é com eles que o programa toma decisões. Nesta aula você também vai conhecer uma ideia muito usada em Python: todo valor, até um número ou um texto, pode ser tratado como verdadeiro ou falso.
- Os dois valores booleanos,
TrueeFalse, e como escrevê-los (com maiúscula!). - Que toda comparação (
idade >= 18) responde com um booleano. - A guardar a resposta de uma pergunta numa variável, como
pode_votar. - O que é truthy e falsy: por que
0e""contam como falso. - Por que
True + Truedá2, e como isso ajuda a contar. - A diferença entre o valor
Truee o texto"True". - Os erros reais:
trueminúsculo eTrue = 1.
Os programas desta aula rodaram no Python 3.14 da máquina da Ana (usuária ana, computador notebook), e podem ser repetidos no editor do guia.
A ideia: o interruptor de luz
Um interruptor só tem duas posições: ligado ou desligado. Não existe "meio ligado". A plaquinha na porta da padaria também: ou está virada para "ABERTO", ou para "FECHADO".
Um booleano é isso: um valor que só pode ser True ou False. O nome vem de George Boole, um matemático inglês do século XIX que estudou as contas com "verdadeiro" e "falso", que hoje são a base de todos os computadores.
| Valor | Quer dizer | Pense em |
|---|---|---|
True | Verdadeiro, sim | Interruptor ligado, plaquinha "ABERTO" |
False | Falso, não | Interruptor desligado, plaquinha "FECHADO" |
1. Os valores True e False
Você escreve um booleano direto no código, como escreve um número. A Ana anota a situação da padaria:
aberta = True tem_sonho = False print(aberta) print(tem_sonho) print(type(aberta))
$ python3 padaria.py True False <class 'bool'>
- aberta = True
- Guarda o valor verdadeiro na variável
aberta. - True
- Com T maiúsculo e sem aspas. Não é um texto, nem um nome de variável: é uma palavra reservada do Python, um valor pronto.
- tem_sonho = False
- O sonho (o doce) acabou: falso. Também com maiúscula,
F. - <class 'bool'>
- O tipo dos booleanos se chama
bool.
Repare nos nomes: aberta, tem_sonho, pode_votar, esta_pago. Para variáveis booleanas, o costume é escolher um nome que responda bem a "sim" ou "não". Assim, quem lê tem_sonho = False entende na hora: "não tem sonho".
2. Perguntas que respondem True ou False
Na maioria das vezes, você não escreve True ou False à mão: eles aparecem como resposta de uma pergunta. Toda comparação é uma pergunta de sim ou não:
idade = 17 estoque = 0 print(idade >= 18) print(estoque == 0) pode_votar = idade >= 16 print(pode_votar)
$ python3 perguntas.py False True True
- idade >= 18
- "A idade é maior ou igual a 18?" Com 17, não:
False. - estoque == 0
- "O estoque é igual a zero?" (dois sinais de igual: é uma pergunta; um só guarda um valor). Sim:
True. - pode_votar = idade >= 16
- O Python primeiro responde a pergunta da direita (
True) e depois guarda a resposta na variável. No Brasil, o voto é permitido a partir dos 16 anos.
Todos os sinais de comparação (==, !=, <, >, <=, >=) estão na aula Comparações, e o jeito de juntar perguntas ("tem pão e está aberta?") está em and, or e not.
Para que serve: tomar decisões
O booleano é o combustível do if ("se"), que você vai aprender na aula if. Só para matar a curiosidade, a ideia é esta:
aberta = True
if aberta:
print("Pode entrar!")
$ python3 exemplo_if.py Pode entrar!
"Se aberta for verdadeiro, mostre 'Pode entrar!'". Sem booleanos, o programa faria sempre a mesma coisa; com eles, ele escolhe.
3. Truthy e falsy: todo valor tem um lado
Aqui vem uma ideia muito usada em Python. Qualquer valor, e não só True e False, pode ser usado onde se espera um "sim" ou "não". Para saber qual dos dois um valor representa, pergunte ao bool() (aula Conversão de Tipos):
$ python3 -q
>>> bool(0)
False
>>> bool(0.0)
False
>>> bool("")
False
>>> bool([])
False
>>> bool(None)
False
>>> bool(" ")
True
>>> bool(42)
True
>>> bool(-0.5)
True
>>> bool("Ana")
True
>>> bool([0])
True
A regra é: o que é "nada" conta como falso; o resto conta como verdadeiro. Os programadores usam duas palavras em inglês para isso: os valores que contam como verdadeiro são truthy ("verdadeiro-ish", algo como "com cara de verdadeiro"), e os que contam como falso são falsy.
| Tipo | Falsy (conta como False) | Truthy (conta como True) |
|---|---|---|
| Booleano | False | True |
| Número | 0 e 0.0 | Qualquer outro: 42, -1, -0.5 |
| Texto | "" (vazio) | Qualquer texto com algo dentro, até " " (um espaço), "0" e "False" |
| Lista | [] (vazia) | Qualquer lista com itens, até [0] |
| O "nada" | None (aula O Valor None) | — |
Repare em três pegadinhas da lista: " ", com um espaço, não está vazio (tem o espaço dentro), então é truthy. [0] é uma lista com um item (o zero), então também é truthy. E números negativos não são "nada": -0.5 é truthy.
Para que serve
Para escrever perguntas curtas, como "a pessoa digitou alguma coisa?". Em vez de comparar o texto com "", basta usar o próprio texto:
nome = input("Seu nome: ")
if nome:
print("Olá,", nome)
else:
print("Você não digitou nada.")
$ python3 se_nome.py Seu nome: Ana Olá, Ana $ python3 se_nome.py Seu nome: Você não digitou nada.
Na segunda vez, a Ana só apertou Enter. O input() devolveu "", que é falsy, e o programa foi para o else ("senão"). O if e o else têm aulas próprias (if e if e else); por enquanto, guarde a ideia: texto vazio conta como falso.
4. Por baixo do pano, True é 1 e False é 0
Uma curiosidade que vira truque útil: para o Python, o bool é um tipo especial de inteiro. True vale 1 e False vale 0, e dá até para fazer conta com eles:
$ python3 -q >>> True + True 2 >>> True == 1 True >>> False == 0 True >>> True * 10 10
Para que isso serve? Para contar quantas respostas foram "sim". Somando os booleanos, cada True conta 1 e cada False conta 0:
ana_passou = True
bia_passou = False
caio_passou = True
aprovados = ana_passou + bia_passou + caio_passou
print("Aprovados:", aprovados)
$ python3 aprovados.py Aprovados: 2
Missão: na turma da tarde, Davi, Eva e Fábio passaram de ano. Troque o valor que está errado e faça o programa somar os três booleanos, para mostrar Aprovados: 3.
davi_passou = True
eva_passou = False
fabio_passou = True
aprovados = 0
print("Aprovados:", aprovados)
davi_passou = True
eva_passou = True
fabio_passou = True
aprovados = davi_passou + eva_passou + fabio_passou
print("Aprovados:", aprovados)
5. O valor True e o texto "True"
Com aspas, deixa de ser booleano. "True" é um texto de quatro letras, que por acaso formam a palavra "True":
aberta = "True" print(aberta) print(type(aberta)) print(aberta == True)
$ python3 texto_true.py True <class 'str'> False
O print mostra os dois do mesmo jeito, o que engana. Mas o type denuncia: é str. E a pergunta aberta == True responde False: um texto nunca é igual a um booleano.
Esse problema aparece de verdade quando a resposta vem do teclado. O input() sempre devolve texto, e o bool() de qualquer texto não vazio é True, mesmo que a pessoa tenha digitado "n":
resposta = input("A padaria está aberta? (s/n) ")
aberta = bool(resposta)
print("Aberta:", aberta)
$ python3 aberta_input.py A padaria está aberta? (s/n) n Aberta: True
A Ana disse "não", e o programa entendeu "sim"! O bool() não lê o que está escrito; ele só vê que o texto "n" não está vazio. O jeito certo é comparar a resposta com o texto que quer dizer "sim":
resposta = input("A padaria está aberta? (s/n) ")
aberta = resposta == "s"
print("Aberta:", aberta)
$ python3 aberta_certo.py A padaria está aberta? (s/n) n Aberta: False $ python3 aberta_certo.py A padaria está aberta? (s/n) s Aberta: True
resposta == "s" pergunta "a resposta é o texto s?", e a resposta dessa pergunta é o booleano certo.
Formas diferentes de obter um booleano
| Forma | Exemplo | Quando usar |
|---|---|---|
| Escrever o valor | aberta = True | Quando você já sabe a resposta (um valor inicial, uma configuração) |
| Uma comparação | pode_votar = idade >= 16 | O mais comum: a resposta depende de outro valor |
| Comparar um texto | aberta = resposta == "s" | Para transformar uma resposta digitada em booleano |
bool(valor) | tem_estoque = bool(estoque) | Para saber se o valor é truthy; raro, porque o if já faz isso sozinho |
not | fechada = not aberta | Para inverter: not True é False (aula and, or e not) |
Quando dá errado
true com letra minúscula: NameError
Em muitas outras linguagens (JavaScript, Java, C), o verdadeiro se escreve true, com minúscula. No Python, não:
aberta = true print(aberta)
$ python3 minusculo.py
Traceback (most recent call last):
File "/home/ana/minusculo.py", line 1, in <module>
aberta = true
^^^^
NameError: name 'true' is not defined. Did you mean: 'True'?
- line 1
- O erro está na linha 1.
- ^^^^
- Os chapeuzinhos marcam a palavra
true. - NameError
- "Erro de nome": o Python procurou alguma coisa chamada
truee não achou. Sem maiúscula,truenão é o valor verdadeiro; parece o nome de uma variável que ninguém criou. - name 'true' is not defined
- "O nome 'true' não está definido".
- Did you mean: 'True'?
- "Você quis dizer 'True'?". O próprio Python sugere o conserto.
Com tudo em maiúsculas, TRUE, acontece o mesmo: NameError: name 'TRUE' is not defined. Did you mean: 'True'?. Como consertar: True e False, só a primeira letra maiúscula.
True: SyntaxError
True = 1
$ python3 atribuir_true.py
File "/home/ana/atribuir_true.py", line 1
True = 1
^^^^
SyntaxError: cannot assign to True
"Não é possível atribuir a True". True e False são palavras reservadas, valores fixos: não dá para usá-los como nome de variável. Como é um erro de escrita (SyntaxError), o programa nem começa; por isso não aparece a palavra Traceback. Como consertar: escolha um nome de verdade, como aberta = True.
"True" entre aspas, ou bool() numa resposta digitada
Não dá mensagem de erro: o programa roda e responde errado, como você viu na seção 5. Se um "sim" e um "não" dão o mesmo resultado, desconfie de um texto no lugar do booleano. Como consertar: escreva True sem aspas; para respostas digitadas, compare: resposta == "s".
Missão: o programa para com NameError. Conserte o valor booleano.
tem_pao = true print(tem_pao)
tem_pao = True print(tem_pao)
Referência rápida
| Escrita | Resultado | Observação |
|---|---|---|
True, False | tipo bool | Maiúscula na primeira letra, sem aspas |
idade >= 18 | True ou False | Toda comparação devolve um booleano |
bool(0), bool(""), bool([]), bool(None) | False | "Nada" é falsy |
bool(42), bool("Ana"), bool(" "), bool("0") | True | O resto é truthy |
True + True | 2 | True vale 1, False vale 0 |
not True | False | Inverte |
"True" == True | False | Texto não é booleano |
| Sintoma | Causa provável |
|---|---|
NameError: name 'true' is not defined. Did you mean: 'True'? | true ou TRUE: o certo é True |
SyntaxError: cannot assign to True | Tentou usar True como nome de variável |
| "Não" e "sim" dão o mesmo resultado | Um texto no lugar do booleano, ou bool() numa resposta digitada |
Exercícios
1. Verdadeiro ou falso?
Escreva o que o bool() devolve (True ou False):
2. A conta dos booleanos
Quanto vale a soma?
3. Qual linha guarda o valor verdadeiro numa variável?
4. A pessoa digitou n em resposta = input("Aberta? (s/n) "). Quanto vale bool(resposta)?
5. Qual destes valores é falsy?
Missão final: a plaquinha da padaria
Missão: o editor vai responder n (não), mas o programa mostra Aberta: True. Troque o bool(resposta) por uma comparação que só dá True quando a resposta for "s".
resposta = input("A padaria está aberta? (s/n) ")
aberta = bool(resposta)
print("Aberta:", aberta)
resposta = input("A padaria está aberta? (s/n) ")
aberta = resposta == "s"
print("Aberta:", aberta)
Resumo
- O tipo
booltem só dois valores:True(verdadeiro) eFalse(falso), com a primeira letra maiúscula e sem aspas. - Toda comparação responde com um booleano:
idade >= 18éTrueouFalse. Dá para guardar a resposta:pode_votar = idade >= 16. - Todo valor tem um lado: zero, texto vazio, lista vazia e
Nonesão falsy; o resto é truthy, até" ","0"e"False". Truevale 1 eFalsevale 0: somar booleanos conta os "sim"."True"com aspas é texto. Para transformar uma resposta digitada em booleano, compare:resposta == "s", nuncabool(resposta).trueminúsculo dáNameError(com a dicaDid you mean: 'True'?);True = 1dáSyntaxError.