Menu
Playground'da Dene

Python List Comprehension: Söz Dizimi, Filtreleme ve Dict Comprehension'lar

List comprehension'lar, yeni bir listeyi tek okunaklı satırda oluşturmana olanak tanır — map, filtre ya da ikisi birden — loop-and-append kalıbının yerini alır.

Tek Satır, Tek Fikir

Bu kalıbı zaten birkaç kez yazdın: boş bir listeyle başla, bir şey üzerinde döngü kur, belki filtrele ve sonuca append et.

main.py
Output
Click Run to see the output here.

Bir list comprehension aynı şeyi tek satırda söyler:

main.py
Output
Click Run to see the output here.

Baştan sona oku: "numbers içindeki her n için n * 2'den oluşan yeni bir liste." Yapı [expression for item in iterable] şeklindedir.

Bu Python'a özgü bir numara değil — comprehension (kavrayış) denir çünkü yeni listeye ne gireceğini, nasıl inşa edileceğinin mekaniğini yazmak yerine bildirimsel olarak tarif ediyorsun.

Bir Filtre Eklemek

Döngü kısmından sonra bir if ekleyerek filtrele:

main.py
Output
Click Run to see the output here.

İkincisini şöyle oku: "numbers içindeki her n için n * n, ama yalnızca n tek ise."

Eşdeğer döngü:

main.py
Output
Click Run to see the output here.

İkisi de gayet iyi. Comprehension daha kısa ve birkaç tane okuduktan sonra, niyet doğrudan tek satırda olduğu için taramak aslında daha kolaydır.

Birleşik Map ve Filtre

Değerleri bir fonksiyondan geçirip aynı anda filtreleyebilirsin:

main.py
Output
Click Run to see the output here.

3 harften uzun her kelime için, büyük harfli hâlini dahil et.

Comprehension İçinde İç İçe Döngüler

İki for kartezyen çarpım tarzı bir çift üretir:

main.py
Output
Click Run to see the output here.

Sıralama, döngüleri iç içe yazdığında olacağıyla aynıdır: ilk for dış, ikincisi iç döngüdür. Eşdeğer girintili döngü gibi baştan sona okunur.

İki seviye, normal bir döngünün daha iyi okunmaya başladığı sınır civarıdır. Üçe ulaşırsan döngülere geri dön.

Dictionary ve Set Comprehension'lar

Aynı fikir, farklı parantezler:

main.py
Output
Click Run to see the output here.

Set comprehension'lar ilk bakışta dict comprehension'larla aynı görünür — fark key: value mı yoksa tek bir ifade mi olduğudur. Küme parantezleri artı : = dict; küme parantezleri ama : yok = set.

Generator Expression'lar

List comprehension'ın yakın bir ikizi, ama köşeli parantez yerine yuvarlak parantezle — ve kritik olarak, bir liste oluşturmaz:

main.py
Output
Click Run to see the output here.

Generator'ı doğrudan sum() ve any()'ye geçirdiğimize dikkat et — ek parantez yok. Generator expression'lar, çağıranın yalnızca bir kez iterasyon yapmaya ihtiyaç duyduğu durumlar için doğru araçtır. Büyük koleksiyonlar için tam listeye göre daha bellek dostudurlar.

Ne Zaman Normal Bir Döngü Kullanmalı

Comprehension'lar çekicidir. Teknik olarak tek bir satıra çok şey sığdırabilirsin. Ama yapmamalısın.

Şu durumlarda sade bir döngüye başvur:

  • Dönüşüm birden fazla adımsa. Ara değişkenlere ihtiyacın varsa, açık açık yaz.
  • Karmaşık hata yönetimi ya da dallanma varsa.
  • Satırı okuyan biri anlamak için birden fazla duraklıyorsa.

Uyguladığım kural: comprehension'ı tek nefeste okuyup ne yaptığını anlayabiliyorsam, kalır. Takılırsam, onu bir döngü olarak yeniden yazarım.

Bazı comprehension'lar zekice görünür ama zorlar:

main.py
Output
Click Run to see the output here.

Aynı sonuç. Döngü versiyonu beş satır ama "daha uzun" "daha kötü" ile aynı şey değildir.

Yeniden Kullanacağın Birkaç Kalıp

main.py
Output
Click Run to see the output here.

Bu beş kalıp, günlük veri işinin şaşırtıcı derecede büyük bir kısmını kapsar.

Sırada

Artık ana koleksiyon türlerini ve onları birbirine bağlayan comprehension'ı gördün. Sonraki bölüm: fonksiyonlar — davranışı adlandırılmış, yeniden kullanılabilir birimler hâlinde paketlemek.

Sıkça Sorulan Sorular

Python'da list comprehension nedir?

Var olan bir iterable'dan yeni bir liste oluşturmak için kompakt bir söz dizimi. [x * 2 for x in numbers] her sayıyı iki katına çıkarılmış şekilde içeren yeni bir liste oluşturur. Ayrıca filtreleme de yapabilirsin: [x for x in numbers if x > 0].

Ne zaman list comprehension kullanmamalıyım?

Okunabilirliğe zarar verdiğinde. İçerdeki ifade karmaşık ya da derin iç içeyse, uygun değişken adlarıyla yazılmış normal bir for döngüsü daha nettir. Comprehension'lar basit dönüşümler içindir — map ve filtre. Daha karmaşık bir şey için tam bir döngü daha iyi olur.

List comprehension ile generator expression arasındaki fark nedir?

List comprehension tüm listeyi bellekte oluşturur. Generator expression (aynı söz dizimi ama parantezle) elemanları birer birer yield eder. Sonuçları tek seferlik iterasyon yapan bir şeye — örneğin sum(...) — beslediğinde generator kullan; böylece hemen atacağın bir listeyi materyalize etmezsin.

Coddy ile kodlamayı öğren

BAŞLA