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.

Você vai aprender
  • 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):

OperadorPerguntaExemploResposta
==É igual?12 == 12True
!=É diferente?12 != 12False
<É menor?12 < 20True
>É maior?12 > 20False
<=É menor ou igual?12 <= 12True
>=É maior ou igual?12 >= 15False

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:

SinalNomeO que fazExemplo
=AtribuiçãoGuarda um valor numa variável. É uma ordemidade = 18: "a idade agora é 18"
==IgualdadePergunta se dois valores são iguais. Responde True ou Falseidade == 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 = 18 inteiro.
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 do if vem uma pergunta, e a pergunta "é igual?" é o ==. (O := é um tipo especial de atribuição, para casos avançados; aqui, a resposta certa é o ==.)
Como ler em voz alta

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).

Isso é coisa do Python

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

PerguntaFormaQuando usar
Passou de ano?nota >= 7A forma direta: use sempre que puder
not nota < 7Funciona, mas é mais difícil de ler. Evite
Está na faixa?180 <= t <= 220O jeito Python, igual à Matemática
t >= 180 and t <= 220O 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

Comparar o que o 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 um str e um int". Do lado esquerdo está o texto "17" (o input() 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).

Um igual só, onde era pergunta: SyntaxError

SyntaxError: invalid syntax. Maybe you meant '==' or ':=' instead of '='?, como na seção 2. Como consertar: para perguntar, ==.

Comparar com o tipo errado, sem erro nenhum

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.

Sinais na ordem errada: =< 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

EscritaPerguntaObservação
a == ba é igual a b?Dois iguais. 10 == 10.0 é True
a != ba é diferente de b?
a < b, a > bMenor? Maior?Com textos: letra por letra, pelo código de cada caractere
a <= b, a >= bMenor ou igual? Maior ou igual?O = vem por último
x < y < zx < 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
SintomaCausa 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á FalseTipos diferentes (5 e "5"), maiúsculas, acentos, espaço sobrando, ou float depois de conta
A ordem dos textos parece erradaMaiúsculas vêm antes das minúsculas, e letras acentuadas vêm depois de todas

Exercícios

1. True ou False?

7 >= 7 → 7 != 7.0 → "casa" < "carro" → 2 < 5 < 4 →

2. O sinal certo

Complete para perguntar se a senha digitada é diferente da certa:

digitada senha_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 respondem True ou False.
  • = guarda ("recebe"); == pergunta ("é igual a?"). Um = só no if dá SyntaxError, com a dica Maybe you meant '=='.
  • A resposta pode ser guardada: aprovado = nota >= 7.
  • Comparações encadeiam como na Matemática: 180 <= t <= 220 quer dizer "as duas coisas são verdade".
  • 10 == 10.0 é True; float depois 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: == responde False; < e > dão TypeError. Converta o input() antes de comparar.