Entrada do usuário com input() e conversão de tipos
1. Fundamentos da função input()
A função input() é a principal forma de interagir com o usuário em programas Python no terminal. Sua sintaxe básica é simples: input([prompt]). Quando executada, ela pausa a execução do programa e aguarda que o usuário digite algo e pressione Enter.
O comportamento fundamental que todo desenvolvedor Python precisa entender é: input() sempre retorna uma string, independentemente do que o usuário digitar. Se o usuário digitar "42", a função retornará a string "42", não o número inteiro 42.
nome = input()
print(f"Olá, {nome}!")
print(f"Tipo da variável: {type(nome)}")
2. Exibindo prompts e tratando espaços
O parâmetro prompt permite exibir uma mensagem informativa antes da entrada do usuário:
nome = input("Digite seu nome: ")
print(f"Bem-vindo, {nome}!")
Uma prática essencial é usar o método strip() para remover espaços extras no início e fim da string. Isso evita problemas com entradas como " Maria ":
nome = input("Digite seu nome: ").strip()
if not nome:
print("Você não digitou nenhum nome!")
else:
print(f"Olá, {nome}!")
3. Conversão para tipos numéricos
Para trabalhar numericamente com a entrada do usuário, precisamos converter explicitamente o tipo:
# Convertendo para inteiro
idade = int(input("Digite sua idade: "))
print(f"Ano que vem você terá {idade + 1} anos")
# Convertendo para float
preco = float(input("Digite o preço do produto: R$ "))
print(f"Com 10% de desconto: R$ {preco * 0.9:.2f}")
O erro mais comum ao converter é o ValueError, que ocorre quando o usuário digita algo que não pode ser convertido para o tipo desejado:
# Isso causará um erro se o usuário digitar "abc"
numero = int(input("Digite um número: ")) # ValueError: invalid literal for int()
4. Conversão para outros tipos
Cuidados com bool()
A conversão para booleano pode ser enganosa. bool() retorna False apenas para valores vazios ou zero:
valor = input("Digite algo: ")
print(bool(valor)) # False se string vazia, True caso contrário
# Cuidado: "False" como string é True!
print(bool("False")) # True (string não vazia)
Convertendo para sequências
Podemos transformar entradas em listas ou tuplas, mas isso geralmente requer processamento adicional:
# Convertendo string em lista de caracteres
texto = input("Digite uma palavra: ")
lista_caracteres = list(texto)
print(f"Lista de caracteres: {lista_caracteres}")
# Para criar uma lista a partir de valores separados por vírgula
entrada = input("Digite números separados por vírgula: ")
numeros = entrada.split(",")
print(f"Lista: {numeros}")
O perigo do eval()
eval() interpreta a entrada como código Python, o que representa um enorme risco de segurança:
# NUNCA faça isso em produção!
resultado = eval(input("Digite uma expressão: ")) # Usuário pode digitar: __import__('os').system('rm -rf /')
Evite eval() sempre que possível. Use conversões específicas e seguras.
5. Tratamento de erros com try/except
Para criar programas robustos, use try/except para capturar erros de conversão:
while True:
try:
idade = int(input("Digite sua idade: "))
break # Sai do loop se a conversão for bem-sucedida
except ValueError:
print("Erro! Digite apenas números inteiros.")
print(f"Sua idade é {idade}")
Podemos refinar ainda mais com else e finally:
while True:
try:
numero = float(input("Digite um número decimal: "))
except ValueError:
print("Valor inválido. Tente novamente.")
else:
print(f"Número válido: {numero}")
break
finally:
print("Tentativa registrada.") # Executa sempre
6. Combinando input() com condicionais e operadores lógicos
Podemos validar faixas de valores usando condicionais e operadores lógicos:
idade = int(input("Digite sua idade: "))
if 0 <= idade <= 150:
if idade >= 18:
print("Você é maior de idade.")
else:
print("Você é menor de idade.")
else:
print("Idade inválida!")
Um exemplo prático de sistema de login simples com curto-circuito:
USUARIO_CORRETO = "admin"
SENHA_CORRETA = "1234"
usuario = input("Usuário: ").strip()
senha = input("Senha: ").strip()
# Curto-circuito: se usuário estiver errado, não verifica senha
if usuario == USUARIO_CORRETO and senha == SENHA_CORRETA:
print("Login bem-sucedido!")
else:
print("Usuário ou senha incorretos.")
7. Exemplos práticos e armadilhas comuns
Calculadora simples
print("=== Calculadora Simples ===")
try:
num1 = float(input("Primeiro número: "))
num2 = float(input("Segundo número: "))
operador = input("Operador (+, -, *, /): ").strip()
if operador == "+":
resultado = num1 + num2
elif operador == "-":
resultado = num1 - num2
elif operador == "*":
resultado = num1 * num2
elif operador == "/":
if num2 == 0:
print("Erro: divisão por zero!")
else:
resultado = num1 / num2
else:
print("Operador inválido!")
if 'resultado' in locals():
print(f"Resultado: {resultado}")
except ValueError:
print("Erro: digite apenas números válidos.")
Armadilha comum: concatenação vs. soma
# Problema: esquecer de converter
num1 = input("Digite um número: ")
num2 = input("Digite outro número: ")
print(num1 + num2) # "510" se digitou 5 e 10 (concatenação)
# Solução: converter antes
num1 = int(input("Digite um número: "))
num2 = int(input("Digite outro número: "))
print(num1 + num2) # 15 (soma correta)
Usando split() para múltiplos valores
# Capturando vários números em uma linha
entrada = input("Digite 3 números separados por espaço: ")
numeros = entrada.split() # Divide a string em lista
if len(numeros) == 3:
try:
a, b, c = map(int, numeros)
print(f"Soma: {a + b + c}")
print(f"Média: {(a + b + c) / 3:.2f}")
except ValueError:
print("Erro: todos os valores devem ser números inteiros.")
else:
print("Erro: digite exatamente 3 números.")
8. Boas práticas e considerações finais
Ao trabalhar com entrada do usuário, siga estas práticas:
- Documente o tipo esperado: Informe claramente no prompt o que o usuário deve digitar
- Sempre valide: Nunca confie que o usuário digitará o formato correto
- Evite loops infinitos: Sempre forneça uma condição de saída clara
# Exemplo com condição de saída
while True:
entrada = input("Digite 'sair' para encerrar ou um número: ").strip().lower()
if entrada == "sair":
print("Programa encerrado.")
break
try:
numero = float(entrada)
print(f"O dobro de {numero} é {numero * 2}")
except ValueError:
print("Entrada inválida. Digite um número ou 'sair'.")
Dica extra: Para entradas sensíveis como senhas, use o módulo getpass:
import getpass
senha = getpass.getpass("Digite sua senha: ") # Não exibe o que é digitado
print("Senha recebida com segurança!")
Dominar a entrada do usuário com input() e a conversão de tipos é fundamental para criar programas interativos em Python. Lembre-se: toda entrada é string até prova em contrário, e a validação cuidadosa é a chave para programas robustos e seguros.
Referências
- Documentação oficial do Python: input() — Documentação completa da função input() na biblioteca padrão do Python
- Real Python: Basic Input, Output, and String Formatting in Python — Tutorial abrangente sobre entrada e saída básica em Python
- W3Schools: Python input() Function — Referência prática com exemplos da função input()
- GeeksforGeeks: Taking input in Python — Guia detalhado sobre diferentes formas de capturar entrada do usuário em Python
- Python Documentation: Built-in Type Conversion Functions — Documentação oficial das funções de conversão de tipos (int(), float(), bool(), etc.)
- Programiz: Python Type Conversion and Type Casting — Tutorial prático sobre conversão explícita e implícita de tipos em Python