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.
Bir list comprehension aynı şeyi tek satırda söyler:
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:
İkincisini şöyle oku: "numbers içindeki her n için n * n, ama yalnızca n tek ise."
Eşdeğer döngü:
İ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:
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:
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:
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:
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:
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
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.