2.30. Kapsamlar (comprehensions)

Bir kapsam (comprehension), mevcut bir yinelenebilir öğeden tek bir ifadede yeni bir liste, küme, sözlük veya üreteç oluşturur. Boş bir kapla başlayıp bir döngüde ekleme yapma şeklindeki yaygın desenin yerine geçer.

2.30.1. Liste kapsamları

squares = [x * x for x in range(5)]
print(squares)

Çıktı:

[0, 1, 4, 9, 16]

Açıkça yazılmış aynı döngü:

squares = []
for x in range(5):
    squares.append(x * x)

Kapsam biçimi, listeyi yerinde oluşturan tek bir ifadedir. squares = [] yoktur ve .append yoktur – sonuç, kapsamın değeridir.

"[f(x) for x in xs if cond]" ifadesi açıklamalı: baştaki ifade sonuçtur, for yan tümcesi döngü değişkenini adlandırır, if yan tümcesi hangi öğelerin tutulacağını filtreler.

Baştaki ifade her öğeyi üretir; for yan tümcesi döngü değişkenini adlandırır; isteğe bağlı bir if öğeleri filtreler.

2.30.2. if ile filtreleme

İsteğe bağlı bir if yan tümcesi yalnızca eşleşen öğeleri tutar:

evens = [x for x in range(10) if x % 2 == 0]
print(evens)

Çıktı:

[0, 2, 4, 6, 8]

Filtre, baştaki ifadeden önce çalışır – önce x % 2 == 0 kontrol edilir; çıktı için yalnızca eşleşen değerler x öğesine ulaşır.

2.30.3. Sözlük ve küme kapsamları

Aynı biçim sözlük ve küme sabitleriyle de çalışır.

Bir sözlük kapsamı, for öncesinde bir key: value çiftine sahiptir:

squares = {x: x * x for x in range(5)}
print(squares)

Çıktı:

{0: 0, 1: 1, 2: 4, 3: 9, 4: 16}

Bir küme kapsamı süslü parantezler ve tek bir ifade kullanır:

unique_lengths = {len(w) for w in ["a", "bb", "c", "bb"]}
print(unique_lengths)

Çıktı:

{1, 2}

2.30.4. Üreteç ifadeleri

Yuvarlak parantezler bir liste yerine bir üreteç ifadesi (generator expression) üretir. Değerler talep üzerine, birer birer hesaplanır:

total = sum(x * x for x in range(1000))

Milyon öğelik bir liste hiçbir zaman oluşturulmaz. Değerler tek tek sum() fonksiyonuna akar; o da onları toplar ve ilerledikçe her birini atar.

Üreteç ifadeleri, değerleri bir indirgeyici fonksiyona (sum(), max(), any(), all()) veya yineleyici tüketen başka herhangi bir koda beslerken doğru seçimdir – eşdeğer listenin kullanacağı belleği tasarruf ederler.

2.30.5. Bir kapsamı ne zaman kullanmamalı

Kapsamlar kısa ve özdür ancak her zaman daha açık değildir. Şu durumlarda düz bir for döngüsüne başvurun:

  • Gövde birden fazla ifadeye ihtiyaç duyduğunda (bir kapsam tam olarak bir ifadeye sığar).

  • Gövdenin yan etkileri olduğunda (yazdırma, bir dosyaya yazma) – kapsamlar bir koleksiyon oluşturmak içindir, eylemler çalıştırmak için değil.

  • Filtre veya dönüşüm o kadar çok parçaya sahip olduğunda ki kapsam artık soldan sağa okunmadığında.