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.

Você vai aprender
  • 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 + 3 que dá 23 sem erro nenhum.
  • A transformar a resposta em número com int() e float(), 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 padariaNo Python
"O que vai ser hoje?"O texto entre os parênteses: input("O que vai ser hoje? "), o prompt
Esperar o cliente responderO programa fica parado até a pessoa apertar Enter
Anotar no bloquinho o que ouviu, como ouviuO 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!
  1. O print mostra a pergunta.
  2. O input() para o programa. O cursor fica piscando, esperando. Nada acontece até a Ana digitar Ana e apertar Enter.
  3. 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 o input devolveu. 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 input devolveu.
input("Qual é o seu nome? ")
Pergunta e espera, como antes.
print("Olá,", nome)
Sem aspas, nome não é o texto "nome": é a etiqueta, e o print mostra 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, idade e 1; o ^ aponta o +.
TypeError: can only concatenate str (not "int") to str
"Erro de tipo: só dá para concatenar (juntar) str com str, e não int." Em idade está o texto "29"; o 1 é 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.

Desconfie de toda conta com o que veio do 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úmero 2.
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: "))
FormaComo fica na telaQuando usar
print(...) e depois input()Pergunta numa linha, resposta na linha de baixoQuando a pergunta é comprida ou tem várias linhas
nome = input("Seu nome: ")Resposta ao lado da perguntaO jeito mais comum. Prefira este
print("Olá,", input(...))Resposta ao lado da perguntaSó quando a resposta é usada uma única vez. Fica difícil de ler; evite
int(input(...)) / float(input(...))Igual, mas guarda um númeroSempre que a resposta for entrar numa conta

Quando dá errado

Somar a resposta com um número

É o TypeError da seção 4: idade + 1 com idade vinda direto do input. Como consertar: idade = int(input("Quantos anos você tem? ")).

A pessoa digita uma palavra onde o 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.

Número com vírgula ou com casas decimais
$ 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).

Não há nada para ler: 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

EscritaO 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
SintomaCausa provável
TypeError: can only concatenate str (not "int") to strConta com a resposta do input sem converter
2 + 3 deu 23, sem erroDuas 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 lineA entrada acabou antes da resposta (Ctrl+D ou entrada vazia)
KeyboardInterruptA pessoa apertou Ctrl+C
A resposta aparece grudada na perguntaFaltou o espaço no fim do prompt

Exercícios

1. Complete a pergunta

Complete para guardar a resposta da pessoa em cidade:

cidade = ("Sua 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)

Tipo:

3. Convertendo

Complete para que pacotes guarde um número inteiro:

pacotes = (input("Quantos pacotes? "))

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 + 1 dá TypeError e "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 um ValueError.
  • O Enter não entra na resposta, mas os espaços sim.