Tek satır fetişizmi 🤖

Bugün internette bulduğumuz, tek satıra sığdırılamayacak bir şeyi sığdırma girişimi daha var. Buna baktığımızda, linter'lar sadece küfür etmekle kalmıyor, kendilerini cihazınızdan siliyorlar.

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()]))


🧐 Burada ne oluyor?
Bu "şaheserin" yazarı kendine bir görev belirlemiş: Bir metin dosyasındaki tüm sayıları çıkarıp toplamak.

Bu neden fiziksel acıya neden oluyor?
1️⃣ Bellek sınırsız değil. f.readlines() tüm dosyayı RAM'e yükler. Dosya 10 GB ise, sunucunuz bu yazıyı okumayı bitiremeden "görüşürüz" der.
2️⃣ Lambda ile karakter karakter filtreleme. "".join(filter(...)) ile bir dizeyi tek tek karakterlerden birleştirmek, Python'da dize işlemenin en yavaş yoludur. Programlama mı yapıyoruz yoksa boncuk mu diziyoruz?
3️⃣ İç içe liste kavrayışları. Okunabilirlik Mısır hiyeroglifleri seviyesinde. Parantezin nerede kapandığını anlamak için bir şeytan çıkarıcı çağırmanız gerekir.
4️⃣ PEP8 sohbetten ayrıldı. : sonrasında ve operatörlerin etrafında boşluk olmaması yerden tasarruf değil, başkalarına saygısızlıktır.

Sonuç: Yavaş çalışan, bellek tüketen ve tamamen okunamaz bir kod elde ettik.

Bunu insanca nasıl yapmalı?
Metinden sayı çıkarmanız gerekiyorsa, bunun için düzenli ifadeler vardır (düzenli ifadeler).
İşte bu kod sağlıklı bir insanın dünyasında nasıl görünmeli:

import re

def total_sum_from_file(file_path: str) -> float:
total = 0.0
# Bağlam yöneticisi ve satır yineleyici kullanıyoruz
with open(file_path, 'r', encoding='utf-8') as f:
for line in f:
# Sayıya benzeyen her şeyi bul (tam sayı veya ondalıklı)
numbers = re.findall(r"[-+]?\d*\.\d+|\d+", line)
total += sum(map(float, numbers))
return total

print(total_sum_from_file("t.txt"))


Neden daha iyi:
1. Okunabilirlik: Bir stajyer bile 5 saniyede ne olduğunu anlar.
2. Bellek: Dosyayı satır satır okuyoruz. Dosya 10 GB ise, bu kod çökmez.
3. Hız: re.findall C seviyesinde çalışır ve Python'daki karakter karakter filtrenizden daha hızlıdır.

#sigara_ici_kodu