Сегодня у нас очередная попытка впихнуть невпихуемое в одну строку, найденная на просторах интернета. Глядя на это, линтеры не просто ругаются — они выпиливают себя с вашего устройства.
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()]))🧐 Что здесь происходит?
Автор этого «шедевра» поставил себе задачу: извлечь все числа из текстового файла и просуммировать их.
Почему это вызывает физическую боль?
1️⃣ Память — не резиновая.
f.readlines() вываливает весь файл в RAM. Если файл на 10 Гб — ваш сервер скажет «пока» быстрее, чем вы дочитаете этот пост.2️⃣ Посимвольная фильтрация через lambda. Склеивать строку по одному символу через
"".join(filter(...)) — это самый медленный способ обработки строк в Python. Мы тут программируем или бисер перебираем?3️⃣ Вложенные списковые включения. Читаемость на уровне египетских иероглифов. Чтобы понять, где закрывается скобка, нужно вызвать экзорциста.
4️⃣ PEP8 вышел из чата. Отсутствие пробелов после
: и вокруг операторов — это не экономия места, это неуважение к окружающим.Итог: Мы получили код, который работает медленно, жрет память и абсолютно нечитаем.
✅ Как это сделать по-человечески?
Если вам нужно вытащить числа из текста, для этого существуют регулярные выражения.
Вот как этот код должен выглядеть в мире здорового человека:
import re
def total_sum_from_file(file_path: str) -> float:
total = 0.0
# Используем контекстный менеджер и итератор по строкам
with open(file_path, 'r', encoding='utf-8') as f:
for line in f:
# Ищем все, что похоже на число (целое или с точкой)
numbers = re.findall(r"[-+]?\d*\.\d+|\d+", line)
total += sum(map(float, numbers))
return total
print(total_sum_from_file("t.txt"))Почему так лучше:
1. Читаемость: Даже джун поймет, что здесь происходит, за 5 секунд.
2. Память: Мы читаем файл построчно. Если файл весит 10 Гб, этот код не упадет.
3. Скорость:
re.findall на уровне C работает быстрее, чем ваш посимвольный фильтр на Python.#код_курильщика








