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:

  1. Documente o tipo esperado: Informe claramente no prompt o que o usuário deve digitar
  2. Sempre valide: Nunca confie que o usuário digitará o formato correto
  3. 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