Módulo 5 - Entrada de dados com input()

Erros comuns com input() e como evitá-los

10 min de leitura · por Cesar Gargiulo, revisado pela equipe ValorFinal e GuardiaSec · Atualizado em 01/07/2026

O que você vai aprender

  • Ler e entender o ValueError que a conversão levanta com texto inválido.
  • Reconhecer o sintoma de conversão esquecida: contas viram emendas de texto.
  • Contornar o conflito entre a vírgula decimal brasileira e o ponto do Python.
  • Prevenir cada erro com prompt claro e teste consciente, sem prometer blindagem total.

O ValueError de perto

A aula passada terminou com uma promessa de problema: int() e float() só convertem texto que tem cara de número. E o usuário, criatura livre, digita o que quiser. Peça a idade e alguém responde vinte e cinco, por extenso. Nesse instante o programa quebra, e o Python imprime o relatório de erro que você aprendeu a não temer no módulo 3. Hora de provocar esse erro de propósito e ler cada linha dele:

idade = int(input("Quantos anos você tem? "))
# Usuário digita: vinte e cinco

# Traceback (most recent call last):
#   File "programa.py", line 1, in <module>
# ValueError: invalid literal for int() with base 10: 'vinte e cinco'

O ValueError na íntegra. A última linha diz o tipo do erro e mostra o texto que não converteu.

Leia o traceback de baixo para cima, que é onde mora a informação boa. A última linha entrega o tipo, ValueError, e a causa: invalid literal for int(), literal inválido para int(). Em português direto, o texto vinte e cinco não tem como virar número inteiro. A linha de cima aponta onde: linha 1 do arquivo. Note a sutileza do nome: não é TypeError, erro de tipo, porque o tipo estava certo, a int() recebeu texto como esperava. O CONTEÚDO do texto é que era inválido. Valor errado, tipo certo: ValueError.

O mesmo erro aparece com variações que valem conhecer: int("") quando a pessoa aperta Enter sem digitar nada, int("1.75") porque decimal não é inteiro, float("dez") porque extenso não converte. Provoque cada um no Playground ou no terminal, sem medo: erro provocado em ambiente de estudo é vacina contra o susto em programa de verdade.

O erro que não avisa: conversão esquecida

O ValueError é barulhento: quebra o programa e aponta a linha. O segundo erro clássico é o oposto, e por isso mais perigoso: esquecer a conversão não gera erro NENHUM. O programa roda até o fim, de aparência saudável, entregando resultados absurdos. Você já viu o mecanismo na aula passada, o + entre textos que emenda em vez de somar. Veja como ele se disfarça num programa inocente:

nota1 = input("Primeira nota: ")   # faltou o int() ou float()!
nota2 = input("Segunda nota: ")
soma = nota1 + nota2
print("Soma das notas:", soma)
# Digitando 7 e 8, a saída é: Soma das notas: 78
# Nenhum erro na tela. Só um 78 onde deveria haver 15.

O bug silencioso completo: roda sem reclamar e soma 7 com 8 dando 78.

Como se defender de um erro que não grita? Desenvolvendo o reflexo do teste desconfiado: todo programa que faz conta com resposta de input() merece uma rodada com valores cujo resultado você sabe de cabeça. Digite 7 e 8 e espere 15; se sair 78, a assinatura do bug é inconfundível, número emendado em vez de somado. Outra pista é o type(): no meio da investigação, um print(type(nota1)) revela na hora se a variável carrega str onde devia haver int ou float.

A terceira cara da lista merece um sublinhado, porque vai importar no módulo 7: comparar textos que parecem números dá resultado alfabético, não numérico. Para o Python, "9" é maior que "10" pelo mesmo motivo que zebra vem depois de abelha no dicionário. Quando as suas condições de if começarem a se comportar de forma estranha com valores de input(), volte a esta aula: a causa quase sempre é uma conversão que ficou pelo caminho.

Vírgula, ponto e a prevenção honesta

O terceiro tropeço é tipicamente brasileiro. Aqui escrevemos um metro e setenta e cinco como 1,75, com vírgula; o Python, seguindo a convenção americana, só aceita ponto: 1.75. Quando o usuário digita a altura do jeito natural dele, a float() recebe "1,75", não reconhece a vírgula e levanta o já conhecido ValueError: could not convert string to float. O programa quebra por causa de um sinal de pontuação.

altura = float(input("Sua altura em metros (use ponto, ex.: 1.75): "))
print("Altura registrada:", altura)
# O prompt já ensina o formato certo antes do erro acontecer.

Prevenção barata: o próprio prompt mostra um exemplo no formato que o programa aceita.

A prevenção possível neste ponto do curso tem dois níveis, e é importante ser honesto sobre o alcance dela. O primeiro nível é o prompt educativo do exemplo acima: dizer o formato esperado e dar um exemplo. Resolve a maioria dos casos, porque a maioria das pessoas segue o exemplo que vê. O segundo nível, para a vírgula em particular, é o programa trocar a vírgula por ponto antes de converter, usando um recurso de textos que o módulo 12 apresenta direito, o replace. Fica o aperitivo de uma linha para quem quiser experimentar: float(input("Altura: ").replace(",", ".")) aceita tanto 1,75 quanto 1.75.

E o nível que ainda NÃO temos: nenhum prompt, por mais claro que seja, impede o usuário de digitar banana onde era para haver número. A ferramenta que segura o ValueError sem deixar o programa cair é o try/except, e ela tem módulo próprio, o 14, onde a calculadora deste curso volta blindada. Até lá, os seus programas interativos vão quebrar quando alguém digitar o inesperado, e está tudo bem: é o custo honesto de estar no módulo 5 de 16. Saber POR QUE quebrou, apontando a linha e o motivo, você já sabe. Isso é mais do que a maioria dos iniciantes consegue dizer.

Teste rápido

O usuário digita "vinte" num int(input("Idade: ")). O que acontece?

Perguntas frequentes

Qual a diferença entre ValueError e o SyntaxError que vi no módulo 3?
O SyntaxError acontece antes de o programa rodar: o Python nem começa, porque o código está mal escrito, como uma aspa sem par. O ValueError acontece com o programa já rodando, quando uma função recebe conteúdo inválido, como int("abc"). O primeiro é erro de escrita; o segundo, de dado.
Por que digitar 1,75 com vírgula quebra o float()?
Porque o Python segue a convenção americana de decimais, que usa ponto: 1.75. A vírgula não é reconhecida como separador decimal, então float("1,75") levanta ValueError. As saídas práticas: pedir o formato com ponto no prompt ou trocar a vírgula por ponto com replace antes de converter.
Esquecer a conversão gera alguma mensagem de erro?
Na soma de duas respostas, não, e é isso que torna o caso traiçoeiro: "7" + "8" dá "78" sem nenhum aviso. Você percebe pelo resultado absurdo, testando com valores cuja resposta sabe de cabeça. Já texto + número, como "7" + 8, dá TypeError na hora, o que pelo menos denuncia o problema.
Como faço o programa perguntar de novo em vez de quebrar?
Combinando duas peças que ainda vêm pela frente: o try/except do módulo 14, que segura o erro sem derrubar o programa, e o while do módulo 8, que repete a pergunta até vir resposta válida. É a receita da calculadora à prova de erros do curso. Por enquanto, teste os seus programas com valores válidos e provoque os erros de propósito para conhecê-los.
int("25.0") funciona, já que 25.0 é um número redondo?
Não: dá ValueError, porque o texto contém um ponto e a int() só aceita cara de inteiro. Curiosamente, int(25.0) sem aspas funciona e dá 25, porque converter o NÚMERO float para int é outra operação. Se precisar do caminho texto com decimal para inteiro, converta em duas etapas: int(float("25.0")).
O ValueError apaga o que o programa já tinha feito?
Ele interrompe o programa na linha do erro: o que já executou, executou (prints anteriores ficam na tela), e o que viria depois não roda. Nada é desfeito, só abandonado no meio. Por isso a linha apontada no traceback importa: tudo acima dela aconteceu; tudo abaixo, não.

Fontes

Seu progresso fica salvo neste aparelho. Assinantes sincronizam entre os aparelhos.