Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Projeto] Faça como eu fiz: conversor de tipos

def converter_para_inteiro(lista):
  return [int(x) for x in lista]

def verificar_conversao(lista):
  for numero in lista:
    if not isinstance(numero, int):
      raise ValueError("A conversão para inteiro não foi feita corretamente.")
  return True


telefones = ["11987654321", "21912345678", "31987654321", "11911223344"]

try:
  telefones_convertidos = converter_para_inteiro(telefones)
  if verificar_conversao(telefones_convertidos):
    print("Todos os números foram convertidos corretamente!")
except Exception as e:
    print(f'Um erro ocorreu {e}')    
2 respostas
solução!

Olá, Marcelo. Como vai?

Parabéns por mais uma excelente postagem! O seu script para o "conversor de tipos" ficou ótimo. Você combinou de forma muito madura duas funções distintas — uma responsável pela transformação dos dados (converter_para_inteiro) e outra focada na validação do estado desses dados (verificar_conversao) —, amarrando tudo dentro de uma estrutura segura de tratamento de exceções com try/except.

A escolha de utilizar List Comprehension para realizar a conversão rápida de todos os elementos da lista de strings é, como já vimos, a melhor prática de mercado no Python por sua velocidade e legibilidade.

Para agregarmos ainda mais valor ao seu projeto, vale a pena analisarmos uma pequena redundância na sua lógica de verificação e como o Python se comporta por debaixo dos panos durante esse fluxo.


O Fluxo da Informação na Memória

No seu código, a lista passa por uma esteira de processamento que transforma os tipos primitivos e depois valida se a transformação ocorreu conforme o planejado:

  1. Entrada: ["11987654321", ...] (Coleção de strings de texto).
  2. Processamento (int(x)): O interpretador do Python aloca um novo espaço de memória e reconstrói cada caractere de texto como um número inteiro binário.
  3. Saída: [11987654321, ...] (Coleção de inteiros de 64 bits).

Analisando a Redundância: Por que a função verificar_conversao é "segura demais"?

Na estrutura atual, se a função converter_para_inteiro falhar em converter qualquer um dos números (por exemplo, se a lista contivesse um texto com letras como "1198765a321"), a linha int(x) dispararia imediatamente um erro do tipo ValueError nativo do Python e interromperia o programa na mesma hora.

Isso significa que o código nunca chegará a executar a função verificar_conversao(telefones_convertidos) se houver uma falha de conversão. Se ele conseguir passar da primeira linha e chegar até a validação, todos os itens obrigatoriamente já terão sido transformados em int. Logo, a sua função customizada sempre retornará True.

Como deixar seu código mais "Pythônico" e Eficiente?

No mercado, o padrão do Python é seguir uma filosofia chamada EAFP (Easier to Ask for Forgiveness than Permission), que significa: "É mais fácil pedir perdão do que permissão". Em vez de criarmos funções para checar se tudo deu certo depois do processo, nós confiamos que o bloco try vai capturar o erro no exato momento da tentativa de conversão.

Veja como você pode simplificar o seu código, mantendo-o robusto e reduzindo o processamento pela metade (já que o computador não precisará varrer a lista uma segunda vez com o for de verificação):

def converter_para_inteiro(lista):
    # A própria List Comprehension garante que o retorno só terá inteiros
    return [int(x) for x in lista]

telefones = ["11987654321", "21912345678", "31987654321", "11911223344"]

try:
    telefones_convertidos = converter_para_inteiro(telefones)
    # Se chegou aqui sem quebrar, a conversão foi 100% bem-sucedida!
    print("Todos os números foram convertidos corretamente!")
    print(telefones_convertidos)

except ValueError:
    # Captura específica se o texto não puder ser transformado em número
    print("Erro: A lista possui elementos que não são números válidos para conversão.")
except Exception as e:
    # Captura genérica para qualquer outro problema inesperado
    print(f'Um erro inesperado ocorreu: {e}')

Note que capturar o ValueError de forma explícita antes do Exception genérico é uma excelente prática de engenharia de software, pois permite que o seu sistema dê uma resposta muito mais precisa e inteligente para o usuário sobre o que causou o problema.

Seu repositório de exercícios práticos em Python está ficando excelente. Continue explorando esses conceitos de manipulação de tipos e tratamento de erros!

Espero que possa ter lhe ajudado!

PErfeito Evandro, mas o exercício pedia pra fazer com duas funções, a segunda forma que mostrou só tem uma função, considerando o enunciado.