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:
- Entrada:
["11987654321", ...] (Coleção de strings de texto). - 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. - 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!