Python'da liste üreteçleri: yazımı, örnekleri, doğru kullanım sınırı
Beceri rehberi

Python'da liste üreteçleri: yazımı, örnekleri, doğru kullanım sınırı

Hazırlayan: Mindset Institute EditörlüğüGüncellendi: 5 dk okuma

Python'da list comprehension sözdizimi, koşullu filtreleme, if-else kullanımı, iç içe döngüler, sözlük ve küme üreteçleri ve ne zaman kullanılmaması gerektiği.

List comprehension nedir, ne işe yarar?

List comprehension (liste üreteci ya da liste kavrama), mevcut bir yinelenebilir nesneden (liste, aralık, dosya satırları, sözlük anahtarları) yeni bir liste üretmenin kısa sözdizimidir. Aynı işi yapan döngü, boş liste oluşturma ve append çağrısından oluşan çok satırlı kalıbı tek ifadeye indirir.

İfade, köşeli parantez içinde şu parçalardan oluşur: üretilecek değer, kaynağı dolaşan for ifadesi ve isteğe bağlı bir koşul. Örneğin kelimelerin uzunluklarını almak için [len(k) for k in kelimeler] yazılır. Ne yaptığı anlatılırken ise tersine okunur: kelimeler içindeki her k için len(k) değerini al.

Bu yapı Python'a özgü olduğu kadar yaygındır; veri temizleme, dönüştürme, filtreleme ve basit hesaplamaların büyük bölümü bu biçimde yazılır. Doğru kullanıldığında kod hem kısalır hem de niyet daha açık okunur.

Temel sözdizimi: döngüden üreteçe geçiş

Klasik biçimde sayıların karesini almak şöyle yazılır: boş bir liste oluşturulur, for döngüsü sayıları dolaşır, her adımda kare listeye eklenir. List comprehension ile aynı iş [x * x for x in sayilar] ifadesine dönüşür.

Geçiş için basit bir yöntem vardır: • Döngünün içinde append ile eklenen ifadeyi başa alın • Ardından for satırını aynen yazın • Tamamını köşeli parantezle sarın

İfade, kaynak listeyi değiştirmez; her seferinde yeni bir liste döndürür. Bu yüzden orijinal veriyi korumak istediğiniz dönüştürmelerde güvenlidir. Metin işlerinde de aynı kalıp kullanılır: [s.strip() for s in satirlar] bir dosyadan okunan satırların başındaki ve sonundaki boşlukları temizler. Her öğeye bir fonksiyon uygulayıp sonucu toplamak, map çağrısının okunaklı alternatifidir.

Koşul eklemek: filtreleme ve if-else

Sondaki if ifadesi bir filtre görevi görür. [x for x in fiyatlar if x > esik] yalnızca eşiğin üzerindeki değerleri alır. Bu filtre, yalnızca koşulu sağlayan öğelerin sonuca girmesini sağlar; yani çıktı listesi girdiden kısa olabilir.

İfadeye göre değer değiştirmek istiyorsanız koşul farklı bir yere gelir: üretilecek değerin yerine değer if koşul else diğer_değer yazılır ve for ifadesinden önce gelir. Örneğin ["yüksek" if x > esik else "düşük" for x in fiyatlar] her öğe için bir etiket üretir ve çıktı listesinin uzunluğu girdiyle aynı kalır.

Burada en sık karışan nokta konumdur. Yalnızca if kullanıyorsanız for ifadesinin sonuna, if ile birlikte else kullanıyorsanız for ifadesinin önüne yazarsınız. Biri filtrelemek, diğeri dönüştürmek içindir. Her ikisini birlikte gerektiren durumlarda koşullar ayrı ayrı yazılabilir: önce değere göre karar verilir, sonuna filtre eklenir.

İç içe döngüler, sözlük, küme ve üreteç ifadesi

Birden fazla for ifadesi arka arkaya yazılabilir. İç içe listeyi düzleştirmek için [oge for satir in matris for oge in satir] kullanılır; soldaki for dıştaki, sağdaki içteki döngüdür ve okuma sırası klasik iç içe döngülerle aynıdır. Okunabilirlik açısından bu yapıyı çok katmanlı büyütmemek gerekir.

Aynı sözdizimi başka koleksiyonlar için de çalışır: • Sözlük üreteci: {ad: len(ad) for ad in adlar} her isim için uzunluğu değer olarak saklar • Küme üreteci: {k.lower() for k in kelimeler} yinelenenleri eler • Üreteç ifadesi: sum(x * x for x in sayilar) köşeli parantez olmadan, listeyi belleğe almadan öğe öğe üretir

Son madde büyük veri için önemlidir. Liste üreteci tüm sonucu aynı anda bellekte tutar. Yalnızca toplam, en büyük değer ya da bir koşulun sağlanıp sağlanmadığı gibi tek bir sonuç istiyorsanız üreteç ifadesi bellek açısından daha ekonomiktir. Bir sonuç dosyaya satır satır yazılacaksa da üreteç yeterlidir.

Örnek senaryo: veri temizleme

Örneğin bir müşteri listesinden gelen e-posta alanlarında boşluklar, büyük harfler ve boş kayıtlar var. Temizlik işlemi ardışık adımlar gibi düşünülür: boşlukları kırp, küçük harfe çevir, boş olanları ele.

Bunu [e.strip().lower() for e in epostalar if e.strip()] ifadesiyle tek satırda yazabilirsiniz. Ardından yinelenenleri atmak için sonucu kümeye çevirmek ya da en baştan küme üreteciyle çalışmak yeterlidir. Sözlüklerden oluşan bir kayıt listesinden yalnızca aktif müşterilerin adlarını almak için [k["ad"] for k in kayitlar if k["aktif"]] yazarsınız.

Bir adım daha karmaşık hale geldiğinde, örneğin bir kaydın hem doğrulanması hem dönüştürülmesi gerekiyorsa, ifadeyi uzatmak yerine ayrı bir fonksiyon yazıp üreteçte onu çağırmak daha doğru bir tercihtir: [temizle(e) for e in epostalar]. Böylece karmaşıklık fonksiyonun içinde kalır, üreteç satırı okunur kalır ve fonksiyon ayrıca test edilebilir.

Ne zaman list comprehension kullanmamalı?

Kısalık her zaman netlik demek değildir. İfade bir satıra sığmayacak kadar uzadıysa, çok sayıda iç içe katman içeriyorsa ya da okuyan kişi bir bakışta ne ürettiğini anlayamıyorsa klasik döngü daha iyi bir seçimdir. Üreteç, değer üretmek içindir; yan etki için değil.

Özellikle şu durumlardan kaçının: • Yalnızca yan etki için yazılmış ifadeler: [print(x) for x in liste] gibi, sonucunu kullanmadığınız listeyi bellekte üretmek anlamsızdır, düz for döngüsü kullanın • Hata yönetimi gerektiren işlemler: try-except bir ifadenin içine konamaz, bu tür işlemleri ayrı bir fonksiyona taşıyın • Birden çok değişkeni değiştiren karmaşık mantık • Büyük, tek kullanımlık veri: üreteç ifadesi ya da bir döngü bellek açısından daha uygundur

Öğrenirken kendinize basit bir ölçüt koyun: ifadeyi sesli okuduğunuzda doğal bir cümle gibi çıkıyorsa uygundur.

Başlangıçtan ileri düzeye öğrenme yolu

Önce for döngüsü ve listeler iyi oturmalıdır; list comprehension bunların kısaltmasıdır, onların yerine geçmez. Ardından sırasıyla temel dönüştürme, if ile filtreleme, if-else ile etiketleme, iç içe döngü ve son olarak sözlük ile küme üreteçleri çalışılır. Her adımı önce klasik döngüyle yazıp sonra üreteçe çevirmek hem sözdizimini hem sırayı kavramak için etkili bir egzersizdir.

İleri aşamada enumerate ve zip ile birlikte kullanım, fonksiyonlarla birleşim ve üreteç ifadelerinin tembel değerlendirme mantığı gelir. Veri analizi yapacaksanız pandas ile çalışırken çoğu işlemin üreteç yerine vektörel işlemlerle yapılması gerektiğini de bilin; üreteç, küçük koleksiyonlar ve betik içi dönüşümler için iyi bir araçtır.

Mindset programlarında bu beceriyi nerede çalışırsınız?

Python ile Programlama Eğitimi'nin modül başlıkları arasında Veri Yapıları, Döngüler ve Fonksiyonlar bulunur. Liste üreteçlerinin dayandığı liste, sözlük, küme ve for döngüsü kavramları bu modüllerde işlenir. Otomasyon ve raporlama işlerinde Python kullanacak ekipler için bu temel, sonraki aşamalarda dosya ve veri işleme betiklerini daha derli toplu yazmanın başlangıcıdır.

Bir ekipte ortak okuma alışkanlığı kurmak için, kod incelemelerinde hangi dönüştürmelerin üreteçle, hangilerinin döngüyle yazılacağını baştan konuşmak yeterlidir; bu karar kısalığa değil okunabilirliğe göre verilir.

İlgili Mindset programı

Python ile Programlama Eğitimi

Sık sorulanlar

Sık sorulan sorular

List comprehension döngüden daha mı hızlıdır?

Basit dönüştürme ve filtrelemelerde genellikle eşdeğer döngüden biraz daha hızlıdır, çünkü liste oluşturma ve ekleme işlemi yorumlayıcı içinde optimize edilir. Ancak asıl kazanç hız değil okunabilirliktir. Kod karmaşıklaştığında hız kazancı için okunabilirlikten ödün vermeyin.

List comprehension içinde if ile if-else nerede yazılır?

Yalnızca filtrelemek için if, for ifadesinin sonuna yazılır: [x for x in liste if koşul]. Koşula göre farklı değer üretmek için if-else, for ifadesinden önce yazılır: [a if koşul else b for x in liste]. Biri öğeleri eler, diğeri her öğe için bir değer seçer.

Üreteç ifadesi ile liste üreteci arasındaki fark nedir?

Liste üreteci köşeli parantezle çevrilir ve tüm sonucu belleğe alır. Üreteç ifadesi parantezle yazılır ya da bir fonksiyona argüman olarak verilir, değerleri istendikçe tek tek üretir. Bellek tasarrufu için ve yalnızca bir kez dolaşılacak veride üreteç tercih edilir.

Sözlük ve küme için de comprehension yazılabilir mi?

Evet. Süslü parantez içinde anahtar ve değeri kolon işaretiyle ayırarak sözlük üreteci, yalnızca değer yazarak küme üreteci elde edilir. Sözdizimi liste üreteciyle aynı mantığı izler: ifade, for ve isteğe bağlı koşul.

Python List Comprehension: Kullanımı ve Örnekler