Python input()
Até agora, os seus programas só falavam: o print mostra, mas ninguém responde. Um programa fica muito mais útil quando pergunta: qual é o seu nome, quantos pães você quer, quanto custa o quilo. A função input() (em inglês, "entrada": o que entra no programa) para o programa, espera a pessoa digitar alguma coisa e apertar Enter, e entrega ao programa o que foi digitado.
- A pedir uma resposta com
input()e o que acontece enquanto o programa espera. - A escrever a pergunta dentro do próprio
input(o prompt) e por que ela termina com um espaço. - A guardar a resposta para usar depois.
- A regra mais importante: o
input()sempre devolve texto, mesmo quando a pessoa digita um número. - O erro real de somar a resposta com um número, e o
2 + 3que dá23sem erro nenhum. - A transformar a resposta em número com
int()efloat(), e o que acontece quando a pessoa digita outra coisa.
Os programas desta aula foram rodados com o Python 3.14 na máquina fictícia da Ana (usuária ana, computador notebook), com python3 arquivo.py. Nas saídas de terminal, o que aparece depois da pergunta é o que a Ana digitou, seguido de Enter.
A ideia: o balcão da padaria
Na padaria, a atendente pergunta: "O que vai ser hoje?". E aí ela espera. Não faz mais nada até o cliente responder. Quando ele diz "seis pães", ela anota no bloquinho, exatamente como ouviu, e só então continua o atendimento.
O input() é essa atendente:
| Na padaria | No Python |
|---|---|
| "O que vai ser hoje?" | O texto entre os parênteses: input("O que vai ser hoje? "), o prompt |
| Esperar o cliente responder | O programa fica parado até a pessoa apertar Enter |
| Anotar no bloquinho o que ouviu, como ouviu | O input devolve o que foi digitado, sempre como texto |
Guarde bem a última linha da tabela: a atendente anota "seis" no papel, em letras; ela não faz conta nenhuma ali. O input também não. Isso vai ser importante na seção 4.
1. O primeiro input()
print("Qual é o seu nome?")
input()
print("Obrigada!")
$ python3 pergunta.py Qual é o seu nome? Ana « a Ana digitou e apertou Enter Obrigada!
- O
printmostra a pergunta. - O
input()para o programa. O cursor fica piscando, esperando. Nada acontece até a Ana digitarAnae apertar Enter. - Depois do Enter, o programa continua e mostra
Obrigada!.
Funcionou, mas o programa perguntou o nome e não fez nada com ele: a resposta foi jogada fora. Antes de usar a resposta, vamos melhorar a pergunta.
2. O prompt: a pergunta dentro do input
O input pode mostrar a pergunta sozinho: basta escrevê-la entre os parênteses, como no print. Esse texto se chama prompt (em inglês, "deixa", "estímulo": o que convida a pessoa a responder). A diferença é que o prompt não pula a linha: a resposta é digitada logo ao lado da pergunta.
print("Olá,", input("Qual é o seu nome? "))
$ python3 direto.py Qual é o seu nome? Ana Olá, Ana
- input("Qual é o seu nome? ")
- Mostra o prompt, espera a resposta e devolve o que foi digitado. "Devolver" quer dizer que, depois que a pessoa responde, o
input(...)inteiro passa a valer o texto digitado, no caso"Ana". - print("Olá,", …)
- Recebe dois valores: o texto
"Olá,"e o que oinputdevolveu. Mostra os dois com um espaço no meio, como na aula print().
Repare na ordem: o Python precisa do valor do input para poder chamar o print, então primeiro pergunta, espera a resposta e só depois mostra a linha Olá, Ana.
O espaço no fim do prompt
O input mostra o prompt exatamente como está escrito, nem um espaço a mais. Sem o espaço depois do ?, a resposta fica grudada na pergunta:
nome = input("Qual é o seu nome?")
print("Olá,", nome)
$ python3 sem-espaco.py Qual é o seu nome?Ana Olá, Ana
Funciona, mas é desconfortável de ler e de digitar. Por isso o costume é terminar o prompt com um espaço ("Qual é o seu nome? ") ou com dois-pontos e espaço ("Nome: ").
3. Guardando a resposta
Colocar o input dentro do print funciona, mas a resposta só serve para aquela linha. Quase sempre você quer guardar a resposta para usar depois, talvez várias vezes. Para isso, dê um nome a ela:
nome = input("Qual é o seu nome? ")
print("Olá,", nome)
$ python3 ola-nome.py Qual é o seu nome? Ana Olá, Ana
- nome
- Um nome que você escolheu para guardar a resposta. Isso é uma variável, o assunto da aula Variáveis. Por enquanto, pense numa etiqueta colada no que a pessoa digitou.
- =
- Leia como "recebe": nome recebe o que o
inputdevolveu. - input("Qual é o seu nome? ")
- Pergunta e espera, como antes.
- print("Olá,", nome)
- Sem aspas,
nomenão é o texto "nome": é a etiqueta, e oprintmostra o que está guardado nela,Ana.
Com várias perguntas, cada resposta ganha o seu nome:
pao = input("Quantos pães? ")
leite = input("Quantos litros de leite? ")
print("Pedido:", pao, "pães e", leite, "litros de leite")
$ python3 pedido.py Quantos pães? 12 Quantos litros de leite? 2 Pedido: 12 pães e 2 litros de leite
O programa para duas vezes, uma em cada input, de cima para baixo. (O nome pao vai sem til de propósito: nomes com acento funcionam, mas não são o costume. A aula Nomes de Variáveis explica.)
Missão: o programa pergunta o nome, mas só responde "Olá!". Faça ele cumprimentar a pessoa pelo nome: Olá, Ana. (Nesta caixa, quem "digita" a resposta Ana é o próprio editor.)
nome = input("Qual é o seu nome? ")
print("Olá!")
nome = input("Qual é o seu nome? ")
print("Olá,", nome)
Agora uma caixa livre, sem resposta pronta: ao clicar em Rodar, o programa vai esperar, e você digita a resposta no terminal da caixa e aperta Enter.
cidade = input("Em que cidade você mora? ")
print("Que bom! Eu também gosto de", cidade)
4. A regra de ouro: input() sempre devolve texto
Lembra da atendente que anota "seis" em letras? O input faz igual: o que a pessoa digita volta sempre como texto (no Python, o tipo str, de string). Mesmo que ela digite só algarismos. Você pode conferir com a função type(), que diz o tipo de um valor (aula Descobrindo o Tipo):
resposta = input("Digite um número: ")
print(type(resposta))
$ python3 tipo.py Digite um número: 42 <class 'str'>
<class 'str'>: um texto. O que voltou não é o número 42, é o texto "42", com um 4 e um 2, como se tivesse sido escrito entre aspas. Isso tem duas consequências, e as duas pegam todo mundo que está começando.
Consequência 1: somar com um número dá erro
idade = input("Quantos anos você tem? ")
print("Ano que vem você terá", idade + 1)
$ python3 idade.py
Quantos anos você tem? 29
Traceback (most recent call last):
File "/home/ana/idade.py", line 2, in <module>
print("Ano que vem você terá", idade + 1)
~~~~~~^~~
TypeError: can only concatenate str (not "int") to str
- File "/home/ana/idade.py", line 2
- O problema está na linha 2. A linha 1 rodou bem: a pergunta apareceu e a Ana respondeu.
- ~~~~~~^~~
- Os
~sublinham os dois lados da conta,idadee1; o^aponta o+. - TypeError: can only concatenate str (not "int") to str
- "Erro de tipo: só dá para concatenar (juntar)
strcomstr, e nãoint." Emidadeestá o texto"29"; o1é um número inteiro (int). Com um texto do lado esquerdo, o+quer juntar textos, e não sabe juntar um texto com um número.
Para o Python, é como tentar fazer "vinte e nove" + 1. Ele não tenta adivinhar: para e avisa.
Consequência 2: somar duas respostas dá um resultado errado, sem erro
Este é ainda mais traiçoeiro:
a = input("Primeiro número: ")
b = input("Segundo número: ")
print("A soma é", a + b)
$ python3 soma-errada.py Primeiro número: 2 Segundo número: 3 A soma é 23
23! E nenhuma mensagem de erro. Em a está o texto "2" e em b, o texto "3". Texto mais texto é permitido: o + junta os dois, um atrás do outro, como em "Bom " + "dia". O resultado é o texto "23". O programa "funcionou", só que fez a coisa errada.
input
Sempre que a resposta for usada como número, ela precisa ser convertida antes. É o que a próxima seção mostra.
5. Transformando a resposta em número
A função int() (de integer, "inteiro") recebe um texto como "2" e devolve o número inteiro 2. Basta colocar o input dentro dela:
a = int(input("Primeiro número: "))
b = int(input("Segundo número: "))
print("A soma é", a + b)
$ python3 soma-certa.py Primeiro número: 2 Segundo número: 3 A soma é 5
- input("Primeiro número: ")
- Roda primeiro, porque está mais por dentro: pergunta e devolve o texto
"2". - int( … )
- Recebe o texto
"2"e devolve o número2. - a = …
- Guarda o número. Agora
a + bé uma conta de verdade.
Para números com casas decimais, como um preço, use float() (de floating point, "ponto flutuante", o nome técnico dos números com casas decimais):
preco = float(input("Preço do quilo: "))
print("Dois quilos custam", preco * 2)
$ python3 preco.py Preço do quilo: 18.90 Dois quilos custam 37.8
A Ana digitou o preço com ponto, 18.90, porque é assim que o Python escreve números decimais. (Repare também que o resultado saiu 37.8, sem o zero do fim: um número não guarda zeros à direita. Para mostrar 37.80, com duas casas, existe a formatação, na aula f-strings.) Os tipos int e float têm aula própria, Números, e as conversões, outra: Conversão de Tipos.
Missão: o programa responde A soma é 23 quando a pessoa digita 2 e 3. Conserte para ele fazer a conta de verdade e mostrar A soma é 5. (O editor digita o 2 e o 3 por você.)
a = input("Primeiro número: ")
b = input("Segundo número: ")
print("A soma é", a + b)
a = int(input("Primeiro número: "))
b = int(input("Segundo número: "))
print("A soma é", a + b)
6. O input devolve exatamente o que foi digitado
O Enter do fim não entra na resposta: o input tira a quebra de linha. Todo o resto entra, inclusive espaços que a pessoa digitou sem querer. Os colchetes abaixo mostram onde a resposta começa e termina:
nome = input("Nome: ")
print("[" + nome + "]")
$ python3 espacos.py Nome: Ana « a Ana digitou dois espaços antes e dois depois [ Ana ]
Os espaços vieram juntos. Para limpar as pontas existe o método strip(), que você vai ver em Métodos de Texto. E o + aqui funcionou porque os três pedaços são textos.
Formas diferentes de perguntar
print("Seu nome:")
nome1 = input()
nome2 = input("Seu nome: ")
print("Olá,", input("Seu nome: "))
| Forma | Como fica na tela | Quando usar |
|---|---|---|
print(...) e depois input() | Pergunta numa linha, resposta na linha de baixo | Quando a pergunta é comprida ou tem várias linhas |
nome = input("Seu nome: ") | Resposta ao lado da pergunta | O jeito mais comum. Prefira este |
print("Olá,", input(...)) | Resposta ao lado da pergunta | Só quando a resposta é usada uma única vez. Fica difícil de ler; evite |
int(input(...)) / float(input(...)) | Igual, mas guarda um número | Sempre que a resposta for entrar numa conta |
Quando dá errado
É o TypeError da seção 4: idade + 1 com idade vinda direto do input. Como consertar: idade = int(input("Quantos anos você tem? ")).
int() esperava um número
$ python3 soma-certa.py
Primeiro número: dois
Traceback (most recent call last):
File "/home/ana/soma-certa.py", line 1, in <module>
a = int(input("Primeiro número: "))
~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^
ValueError: invalid literal for int() with base 10: 'dois'
Desta vez é um ValueError, "erro de valor": o tipo estava certo (o int() recebeu um texto, como esperava), mas o conteúdo do texto não serve. A explicação: "literal inválido para int() na base 10: 'dois'", ou seja, 'dois' não se escreve com os algarismos de 0 a 9. O int() só entende números inteiros escritos com algarismos, como "2" ou "-15". Repare que o erro aparece depois que a Ana respondeu: o Python só descobre o problema na hora de converter.
Como consertar: no programa, não tem como impedir a pessoa de digitar errado; o que dá para fazer é tratar o erro e perguntar de novo, com try e except (aula try e except). Por enquanto, digite números.
$ python3 preco.py
Preço do quilo: 18,90
Traceback (most recent call last):
File "/home/ana/preco.py", line 1, in <module>
preco = float(input("Preço do quilo: "))
~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^
ValueError: could not convert string to float: '18,90'
"Não foi possível converter o texto em float: '18,90'". No Brasil escrevemos 18,90, mas o float() só entende o ponto. E o int() não aceita casas decimais, nem com ponto:
$ python3 soma-certa.py
Primeiro número: 2.5
Traceback (most recent call last):
File "/home/ana/soma-certa.py", line 1, in <module>
a = int(input("Primeiro número: "))
~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^
ValueError: invalid literal for int() with base 10: '2.5'
Como consertar: para valores com casas decimais, use float() e digite com ponto. Para aceitar a vírgula, o programa pode trocá-la por ponto antes de converter (o método replace(), em Métodos de Texto).
EOFError
Às vezes o programa pede uma resposta e a entrada já acabou. Dá para ver isso no terminal com o < /dev/null, que liga a entrada do programa a um "arquivo vazio" no lugar do teclado:
$ python3 ola-nome.py < /dev/null
Qual é o seu nome? Traceback (most recent call last):
File "/home/ana/ola-nome.py", line 1, in <module>
nome = input("Qual é o seu nome? ")
~~~~~^^^^^^^^^^^^^^^^^^^^^^^
EOFError: EOF when reading a line
EOF é end of file, "fim do arquivo": "chegou ao fim da entrada enquanto lia uma linha". O traceback começa logo depois do prompt, na mesma linha, porque o prompt não pula linha e ninguém apertou Enter. O mesmo erro aparece se, no terminal, você apertar Ctrl+D (o sinal de "acabou a entrada") em vez de responder. E se apertar Ctrl+C, o programa é interrompido e o traceback termina em KeyboardInterrupt ("interrupção pelo teclado"). Nos dois casos, nada de grave: é só rodar de novo.
Missão: o programa para com TypeError quando a pessoa responde 29. Conserte para ele mostrar Ano que vem você terá 30.
idade = input("Quantos anos você tem? ")
print("Ano que vem você terá", idade + 1)
idade = int(input("Quantos anos você tem? "))
print("Ano que vem você terá", idade + 1)
Referência rápida
| Escrita | O que faz |
|---|---|
input() | Espera a pessoa digitar e apertar Enter; devolve o texto digitado (sem o Enter) |
input("Nome: ") | Mostra o prompt, sem pular linha, e espera a resposta ao lado dele |
nome = input("Nome: ") | Guarda a resposta com o nome nome |
int(input("Idade: ")) | Converte a resposta em número inteiro |
float(input("Preço: ")) | Converte a resposta em número com casas decimais (digitado com ponto) |
type(input()) | Sempre <class 'str'>: o input devolve texto |
| Sintoma | Causa provável |
|---|---|
TypeError: can only concatenate str (not "int") to str | Conta com a resposta do input sem converter |
2 + 3 deu 23, sem erro | Duas respostas do input somadas sem converter: o + juntou os textos |
ValueError: invalid literal for int() with base 10: 'dois' | A pessoa digitou algo que não é um número inteiro |
ValueError: could not convert string to float: '18,90' | Decimal digitado com vírgula |
EOFError: EOF when reading a line | A entrada acabou antes da resposta (Ctrl+D ou entrada vazia) |
KeyboardInterrupt | A pessoa apertou Ctrl+C |
| A resposta aparece grudada na pergunta | Faltou o espaço no fim do prompt |
Exercícios
1. Complete a pergunta
Complete para guardar a resposta da pessoa em cidade:
2. O tipo da resposta
A pessoa digitou 15. Qual é o tipo do valor que o input() devolveu? (escreva o nome curto do tipo, em minúsculas)
3. Convertendo
Complete para que pacotes guarde um número inteiro:
4. Sem conversão, a pessoa digita 4 e depois 5. O que mostra print(a + b)?
5. Por que se costuma terminar o prompt com um espaço, como em input("Nome: ")?
6. A pessoa digita 3.5. Qual destas linhas funciona?
Missão final: o pedido da padaria
Missão: cada pão custa 0.75. Complete o programa: ele já pergunta o nome; faça ele perguntar também quantos pães a pessoa quer e mostrar, por exemplo, Ana, seus 6 pães custam 4.5. (O editor responde Ana e 6.)
nome = input("Seu nome: ")
print(nome, "seu pedido está anotado")
nome = input("Seu nome: ")
paes = int(input("Quantos pães? "))
print(nome + ",", "seus", paes, "pães custam", paes * 0.75)
Resumo
input()para o programa, espera a pessoa digitar e apertar Enter, e devolve o que foi digitado.- O texto entre os parênteses é o prompt: aparece antes da resposta, sem pular linha. Termine-o com um espaço.
- Guarde a resposta com um nome:
nome = input("Nome: "). - O
input()sempre devolve texto (str), mesmo quando a pessoa digita só algarismos. - Por isso,
resposta + 1dáTypeErrore"2" + "3"dá"23", sem erro. - Para fazer contas, converta:
int(input(...))para inteiros,float(input(...))para decimais (com ponto). Se a pessoa digitar outra coisa, vem umValueError. - O Enter não entra na resposta, mas os espaços sim.