Python Comparações (==, !=, <, >)
"A nota é maior ou igual a 7?" "A senha digitada é igual à senha certa?" "O forno está entre 180 e 220 graus?" Um programa vive fazendo perguntas assim, e as respostas decidem o que ele vai fazer em seguida. Para perguntar, o Python tem seis operadores de comparação, e cada um responde com um booleano: True ou False (aula Booleanos). Nesta aula você vai conhecer os seis, nunca mais confundir = com ==, aprender o atalho 1 < x < 10 e descobrir as surpresas de comparar textos.
- Os seis operadores:
==,!=,<,>,<=e>=. - A diferença entre
=(guarda) e==(pergunta). - A guardar a resposta numa variável:
aprovado = nota >= 7. - A encadear comparações:
180 <= temperatura <= 220. - Como o Python compara textos: letra por letra, com maiúsculas e acentos contando.
- Por que
"10" < "9"éTrue. - O que acontece ao comparar número com texto, o erro do
input().
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: a balança de dois pratos
Numa balança antiga, de dois pratos, você coloca uma coisa de cada lado e olha: os pratos ficaram nivelados? Qual lado desceu? A balança não diz "quanto"; ela só responde a pergunta.
Os operadores de comparação são essa balança. Você põe um valor de cada lado do operador, e o Python responde com True (sim) ou False (não):
| Operador | Pergunta | Exemplo | Resposta |
|---|---|---|---|
== | É igual? | 12 == 12 | True |
!= | É diferente? | 12 != 12 | False |
< | É menor? | 12 < 20 | True |
> | É maior? | 12 > 20 | False |
<= | É menor ou igual? | 12 <= 12 | True |
>= | É maior ou igual? | 12 >= 15 | False |
No caderno, você escreveria ≠, ≤ e ≥. Como esses sinais não existem no teclado, o Python usa dois caracteres: != (o ! quer dizer "não"), <= e >=. O sinal de "igual" vem sempre por último: <=, nunca =<.
1. As seis comparações
estoque = 12 print(estoque == 12) print(estoque != 12) print(estoque < 20) print(estoque > 20) print(estoque <= 12) print(estoque >= 15)
$ python3 comparacoes.py True False True False True False
- estoque == 12
- "O estoque é igual a 12?" Sim.
- estoque != 12
- "O estoque é diferente de 12?" Não, é igual.
- estoque < 20
- "É menor que 20?" Sim.
- estoque > 20
- "É maior que 20?" Não.
- estoque <= 12
- "É menor ou igual a 12?" É igual, então sim. Com
<(só "menor") a resposta seria não. - estoque >= 15
- "É maior ou igual a 15?" Não.
A resposta é um valor como outro qualquer: dá para mostrar, como acima, ou guardar numa variável. A Ana usa a média 7 para aprovar:
nota = 8.5
aprovado = nota >= 7
print("Aprovado:", aprovado)
$ python3 aprovacao.py Aprovado: True
O Python resolve primeiro a comparação da direita (8.5 >= 7 é True) e depois guarda o True em aprovado. Mais adiante, essas respostas vão decidir o caminho do programa no if.
Missão: na escola da Ana, quem tira 7 ou mais passa. A Bia tirou 7, mas o programa diz que ela não passou. Conserte a comparação.
nota = 7
aprovado = nota > 7
print("Aprovado:", aprovado)
nota = 7
aprovado = nota >= 7
print("Aprovado:", aprovado)
2. = guarda, == pergunta
É a confusão número um de quem está começando:
| Sinal | Nome | O que faz | Exemplo |
|---|---|---|---|
= | Atribuição | Guarda um valor numa variável. É uma ordem | idade = 18: "a idade agora é 18" |
== | Igualdade | Pergunta se dois valores são iguais. Responde True ou False | idade == 18: "a idade é 18?" |
Se você usar um igual só onde o Python espera uma pergunta, ele avisa, e o Python 3.14 até sugere o conserto:
idade = 18
if idade = 18:
print("Maior de idade!")
$ python3 if_um_igual.py
File "/home/ana/if_um_igual.py", line 2
if idade = 18:
^^^^^^^^^^
SyntaxError: invalid syntax. Maybe you meant '==' or ':=' instead of '='?
- line 2
- O problema está na linha 2, a do
if("se"). - ^^^^^^^^^^
- Os chapeuzinhos marcam
idade = 18inteiro. - SyntaxError: invalid syntax
- "Sintaxe inválida": o código nem começou a rodar.
- Maybe you meant '==' or ':=' instead of '='?
- "Talvez você quisesse
==ou:=no lugar de=?". Depois doifvem uma pergunta, e a pergunta "é igual?" é o==. (O:=é um tipo especial de atribuição, para casos avançados; aqui, a resposta certa é o==.)
Leia o = como "recebe" e o == como "é igual a". idade = 18: "idade recebe 18". idade == 18: "idade é igual a 18?". Fica difícil confundir.
3. Comparando números
Para o ==, o que importa é o valor, não o tipo: um int e um float com o mesmo valor são iguais. E, como você viu na aula Booleanos, True vale 1:
$ python3 -q >>> 10 == 10.0 True >>> 1 == 1.0 == True True >>> 0.1 + 0.2 == 0.3 False
A última você já conhece da aula Números: o float guarda uma aproximação, e 0.1 + 0.2 sai 0.30000000000000004. Não compare float com == depois de fazer contas; arredonde antes (round(0.1 + 0.2, 2) == 0.3) ou use math.isclose() (aula O Módulo math).
4. Encadeando: 1 < x < 10
O forno da padaria assa bem o pão entre 180 e 220 graus. Na Matemática, você escreveria 180 ≤ t ≤ 220. No Python, pode escrever igualzinho:
temperatura = 200 print(180 <= temperatura <= 220) temperatura = 250 print(180 <= temperatura <= 220)
$ python3 faixa.py True False
Quando você encadeia comparações, o Python faz cada uma e só responde True se todas forem verdadeiras. 180 <= temperatura <= 220 quer dizer "180 ≤ temperatura e temperatura ≤ 220". Com 250, a segunda parte é falsa, e a resposta é False.
$ python3 -q >>> x = 5 >>> 1 < x < 10 True >>> 1 < x < 3 False >>> 3 == 3 == 3 True >>> 1 < x > 2 True
O último funciona, mas confunde: é "1 < x e x > 2". Encadear fica claro quando os sinais apontam para o mesmo lado, como uma faixa: mínimo <= x <= máximo. Para outros casos, escreva as duas perguntas com and (aula and, or e not).
Em C e JavaScript, 1 < x < 3 não quer dizer "x entre 1 e 3" (e, em Java, nem é aceito): a linguagem compara 1 < x, obtém verdadeiro ou falso, e depois compara esse resultado com 3. O encadeamento como na Matemática é uma gentileza do Python.
5. Comparando textos
Os mesmos operadores funcionam com textos. Para o ==, dois textos só são iguais se forem iguais caractere por caractere:
$ python3 -q >>> "Ana" == "ana" False >>> "pão" == "pao" False >>> "Ana" == "Ana " False
Maiúscula é diferente de minúscula, letra com acento é diferente de letra sem acento, e um espaço sobrando no fim também conta. Isso importa muito numa senha:
senha_certa = "pao123"
digitada = input("Senha: ")
print("Acesso liberado:", digitada == senha_certa)
$ python3 senha.py Senha: Pao123 Acesso liberado: False $ python3 senha.py Senha: pao123 Acesso liberado: True
Quando você quer comparar sem ligar para maiúsculas (num nome de cidade, numa resposta "sim"/"SIM"), passe os dois lados para minúsculas antes, com .lower(): "ana".lower() == "Ana".lower() dá True. O .lower() está na aula Métodos de Texto.
Maior e menor com textos: a "ordem do dicionário"… quase
Com < e >, o Python compara os textos letra por letra, da esquerda para a direita, como num dicionário. A primeira letra diferente decide:
$ python3 -q >>> "abacaxi" < "banana" True >>> "banana" < "bananada" True >>> "Zebra" < "abacaxi" True >>> "10" < "9" True >>> 10 < 9 False >>> "maçã" < "mamão" False
- "abacaxi" < "banana"
- "a" vem antes de "b":
True. Como no dicionário. - "banana" < "bananada"
- As seis primeiras letras são iguais, e "banana" acabou antes: o texto mais curto vem primeiro.
True. - "Zebra" < "abacaxi"
- Surpresa:
True. Para o Python, todas as maiúsculas vêm antes de todas as minúsculas. - "10" < "9"
- Outra surpresa:
True. São textos, então o Python compara o primeiro caractere, "1" com "9", e "1" vem antes. Com números,10 < 9éFalse, como deveria. - "maçã" < "mamão"
False! No dicionário, "maçã" vem antes de "mamão" (ç conta como c). Para o Python, o "ç" vem depois de todas as letras sem acento.
Por quê? Porque, por baixo do pano, cada caractere é um número (o seu código na tabela Unicode), e o Python compara esses números. A função ord() mostra o código de um caractere:
>>> ord("A"), ord("Z"), ord("a"), ord("ç"), ord("m")
(65, 90, 97, 231, 109)
"Z" é 90 e "a" é 97: por isso "Zebra" vem antes de "abacaxi". "ç" é 231 e "m" é 109: por isso "maçã" vem depois de "mamão". Moral: < com textos serve bem para palavras sem acento e todas em minúsculas; para ordenar nomes em português "de verdade", existem ferramentas próprias, que aparecem na aula Ordenando Listas.
6. Número com texto
Um número e um texto nunca são iguais, mesmo que pareçam:
$ python3 -q >>> 5 == "5" False
O == só responde False, sem erro. Mas "maior" e "menor" entre número e texto não fazem sentido, e aí o Python para:
$ python3 -q
>>> 5 < "5"
Traceback (most recent call last):
File "<python-input-0>", line 1, in <module>
5 < "5"
TypeError: '<' not supported between instances of 'int' and 'str'
"< não é suportado entre int e str". Na prática, esse erro quase sempre vem do input(), que devolve texto. Você vai vê-lo em Quando dá errado.
Formas diferentes de fazer a mesma pergunta
| Pergunta | Forma | Quando usar |
|---|---|---|
| Passou de ano? | nota >= 7 | A forma direta: use sempre que puder |
not nota < 7 | Funciona, mas é mais difícil de ler. Evite | |
| Está na faixa? | 180 <= t <= 220 | O jeito Python, igual à Matemática |
t >= 180 and t <= 220 | O jeito das outras linguagens; funciona igual (aula and, or e not) | |
| É diferente? | resposta != "s" | O normal |
not resposta == "s" | Funciona, mas o != é mais claro | |
| Mesmo texto, sem ligar para maiúsculas? | a.lower() == b.lower() | Respostas digitadas, nomes de cidades |
Quando dá errado
input() leu com um número: TypeError
idade = input("Sua idade: ")
print("Pode votar:", idade >= 16)
$ python3 idade_texto.py
Sua idade: 17
Traceback (most recent call last):
File "/home/ana/idade_texto.py", line 2, in <module>
print("Pode votar:", idade >= 16)
^^^^^^^^^^^
TypeError: '>=' not supported between instances of 'str' and 'int'
- line 2
- O erro é na linha 2.
- ^^^^^^^^^^^
- Os chapeuzinhos marcam a comparação
idade >= 16. - TypeError
- "Erro de tipo".
- '>=' not supported between instances of 'str' and 'int'
- "
>=não é suportado entre umstre umint". Do lado esquerdo está o texto"17"(oinput()sempre devolve texto); do lado direito, o número 16.
Como consertar: converta antes de comparar: idade = int(input("Sua idade: ")) (aula Conversão de Tipos).
SyntaxError
SyntaxError: invalid syntax. Maybe you meant '==' or ':=' instead of '='?, como na seção 2. Como consertar: para perguntar, ==.
5 == "5" e idade == "18" (com idade sendo número) respondem False calados. E "10" < "9" responde True, também calado. Se uma comparação dá uma resposta que não faz sentido, confira o tipo dos dois lados com type(): um deles provavelmente é texto. Como consertar: compare número com número e texto com texto.
=< e =>
nota = 5 print(nota =< 7)
$ python3 ordem_errada.py
File "/home/ana/ordem_errada.py", line 2
print(nota =< 7)
^
SyntaxError: invalid syntax
O chapeuzinho aponta o < que sobrou depois do =. O mesmo vale para =>. O sinal de igual vem sempre por último: <=, >=, !=. (A mesma ordem da fala: "menor ou igual".)
Missão: o editor vai digitar 17, e o programa para com TypeError. Converta a idade para número antes de comparar.
idade = input("Sua idade: ")
print("Pode votar:", idade >= 16)
idade = int(input("Sua idade: "))
print("Pode votar:", idade >= 16)
Referência rápida
| Escrita | Pergunta | Observação |
|---|---|---|
a == b | a é igual a b? | Dois iguais. 10 == 10.0 é True |
a != b | a é diferente de b? | |
a < b, a > b | Menor? Maior? | Com textos: letra por letra, pelo código de cada caractere |
a <= b, a >= b | Menor ou igual? Maior ou igual? | O = vem por último |
x < y < z | x < y e y < z? | Encadeamento, como na Matemática |
"Ana" == "ana" | False: maiúsculas contam | |
"10" < "9" | True: são textos | |
5 == "5" | False: número não é texto | |
5 < "5" | TypeError |
| Sintoma | Causa provável |
|---|---|
SyntaxError: invalid syntax. Maybe you meant '==' or ':=' instead of '='? | Um = só onde era pergunta |
TypeError: '>=' not supported between instances of 'str' and 'int' | Comparou o texto do input() com um número: converta com int() |
Uma igualdade que devia dar True dá False | Tipos diferentes (5 e "5"), maiúsculas, acentos, espaço sobrando, ou float depois de conta |
| A ordem dos textos parece errada | Maiúsculas vêm antes das minúsculas, e letras acentuadas vêm depois de todas |
Exercícios
1. True ou False?
2. O sinal certo
Complete para perguntar se a senha digitada é diferente da certa:
3. Qual a diferença entre x = 5 e x == 5?
4. Por que "Zebra" < "abacaxi" é True?
5. Qual expressão pergunta se a idade está entre 18 e 65, incluindo os dois?
Missão final: o forno no ponto
Missão: o pão assa bem com o forno entre 180 e 220 graus, incluindo os dois. Troque o False por uma comparação encadeada que responda se a temperatura está nessa faixa.
temperatura = 220
no_ponto = False
print("No ponto:", no_ponto)
temperatura = 220
no_ponto = 180 <= temperatura <= 220
print("No ponto:", no_ponto)
Experimente trocar a temperatura por 179, 180 e 221 e ver a resposta mudar.
Resumo
- Os seis operadores de comparação são
==,!=,<,>,<=e>=, e todos respondemTrueouFalse. =guarda ("recebe");==pergunta ("é igual a?"). Um=só noifdáSyntaxError, com a dicaMaybe you meant '=='.- A resposta pode ser guardada:
aprovado = nota >= 7. - Comparações encadeiam como na Matemática:
180 <= t <= 220quer dizer "as duas coisas são verdade". 10 == 10.0éTrue;floatdepois de conta não se compara com==.- Textos se comparam caractere por caractere: maiúsculas, acentos e espaços contam. Na ordem, maiúsculas vêm antes das minúsculas e
"10" < "9". - Número e texto:
==respondeFalse;<e>dãoTypeError. Converta oinput()antes de comparar.