Hoje temos mais uma tentativa de enfiar o impossível em uma única linha, encontrada na internet. Olhando para isso, os linters não apenas reclamam — eles se desinstalam do seu dispositivo.
with open("t") as f:print(sum([sum([float(m) for m in "".join(filter(lambda x:x.isnumeric() or x.isspace() or x==".",l)).split()]) for l in f.readlines()]))🧐 O que está acontecendo aqui?
O autor desta "obra-prima" se propôs a tarefa: extrair todos os números de um arquivo de texto e somá-los.
Por que isso causa dor física?
1️⃣ Memória não é elástica.
f.readlines() despeja o arquivo inteiro na RAM. Se o arquivo tem 10 GB — seu servidor dirá "tchau" mais rápido do que você termina de ler este post.2️⃣ Filtragem caractere por caractere via lambda. Juntar a string caractere por caractere com
"".join(filter(...)) é a forma mais lenta de processar strings em Python. Estamos programando ou enfiando contas?3️⃣ Compreensões de lista aninhadas. Legibilidade no nível de hieróglifos egípcios. Para entender onde um parêntese fecha, é preciso chamar um exorcista.
4️⃣ PEP8 saiu do chat. Ausência de espaços após
: e ao redor de operadores não é economia de espaço, é desrespeito aos outros.Conclusão: Obtivemos um código que funciona devagar, consome memória e é absolutamente ilegível.
✅ Como fazer de forma humana?
Se você precisa extrair números de um texto, para isso existem expressões regulares.
Veja como esse código deveria ser no mundo de uma pessoa sã:
import re
def total_sum_from_file(file_path: str) -> float:
total = 0.0
# Usamos gerenciador de contexto e iterador por linhas
with open(file_path, 'r', encoding='utf-8') as f:
for line in f:
# Procuramos tudo que se parece com número (inteiro ou com ponto)
numbers = re.findall(r"[-+]?\d*\.\d+|\d+", line)
total += sum(map(float, numbers))
return total
print(total_sum_from_file("t.txt"))Por que é melhor assim:
1. Legibilidade: Até um júnior entenderá o que está acontecendo em 5 segundos.
2. Memória: Lemos o arquivo linha por linha. Se o arquivo pesa 10 GB, este código não vai cair.
3. Velocidade:
re.findall em nível C funciona mais rápido que seu filtro caractere por caractere em Python.#código_fumante
Comentários
0Ainda não há comentários.
Entre para participar da conversa.