İçeriğe geç
Educora
İleri14 dk12 / 42

Liste ve sözlük üreteçleri

Listeleri, sözlükleri ve kümeleri tek satırda oluştur: üreteçler (comprehension), filtre koşulları ve üreteç ifadeleri.

Kendini test et
Bu derste öğreneceklerin
  • Bir döngüyü liste üreteciyle değiştirmek
  • Üretece filtre koşulu ve if ... else ifadesi eklemek
  • Sözlük ve küme üreteçleri yazmak

Listeler dersinde yeni bir listeyi şöyle oluşturuyorduk: boş bir liste oluştur, döngü yaz, her adımda append yap. Bu üç dört satır tutar. Python'da aynı işi tek satırda yapan özel bir yazım vardır: üreteç (İngilizcesiyle comprehension). Profesyonel Python programcıları onu her gün kullanır.

Liste üreteci

Köşeli parantez içine önce her eleman için hesaplanacak ifade, ardından sıradan bir for kısmı yazılır. İki yol da aynı sonucu verir; karşılaştır:

Python
squares = []
for n in range(1, 6):
    squares.append(n * n)
print(squares)

squares = [n * n for n in range(1, 6)]
print(squares)
▸ Beklenen çıktı
[1, 4, 9, 16, 25]
[1, 4, 9, 16, 25]
Text
[expression for item in iterable if condition]
{key: value for item in iterable if condition}
{expression for item in iterable}
Liste, sözlük ve küme üreteçlerinin genel yapısı; if kısmı isteğe bağlıdır.

Üretecin asıl gücü filtredir: sondaki if yalnızca koşula uyan elemanları tutar. İfade ise herhangi bir şey olabilir: bir metot çağrısı, bir fonksiyon, bir hesaplama:

Python
numbers = [12, 7, 30, 5, 18, 21]
evens = [n for n in numbers if n % 2 == 0]
print(evens)

names = ['aysel', 'tural', 'ali']
print([name.title() for name in names])
print([len(name) for name in names])
▸ Beklenen çıktı
[12, 30, 18]
['Aysel', 'Tural', 'Ali']
[5, 5, 3]

Elemanları atmak değil de iki farklı şekilde dönüştürmek istiyorsan koşullu ifade kullan: A if koşul else B. Dikkat: bu ifade for'dan önce yazılır, filtre if'i ise sonra.

Python
numbers = [3, 8, 11, 14]
labels = ['even' if n % 2 == 0 else 'odd' for n in numbers]
print(labels)
▸ Beklenen çıktı
['odd', 'even', 'odd', 'even']

Sözlük üreteci

Süslü parantez ve bir anahtar: değer çifti yazarsan liste yerine sözlük elde edersin. Bu; bir listeden sözlük oluşturmak, değerleri değiştirmek ya da çiftleri süzmek için çok kullanışlıdır. Markette %10 indirim başladı:

Python
names = ['Aysel', 'Tural', 'Ali']
lengths = {name: len(name) for name in names}
print(lengths)

prices = {'bread': 0.8, 'milk': 1.9, 'cheese': 6.5}
sale = {item: round(price * 0.9, 2) for item, price in prices.items()}
print(sale)

scores = {'Aysel': 91, 'Murad': 48, 'Leyla': 76}
passed = {name: s for name, s in scores.items() if s >= 50}
print(passed)
▸ Beklenen çıktı
{'Aysel': 5, 'Tural': 5, 'Ali': 3}
{'bread': 0.72, 'milk': 1.71, 'cheese': 5.85}
{'Aysel': 91, 'Leyla': 76}

Küme üreteçleri ve üreteç ifadeleri

Süslü parantez içine tek bir ifade yazarsan bir küme elde edersin; tekrarlar otomatik olarak silinir. Parantezleri tamamen kaldırıp üreteci doğrudan bir fonksiyona verirsen bir üreteç ifadesi elde edersin: elemanları ayrı bir liste oluşturmadan tek tek üretir ve bellekten tasarruf sağlar.

Python
words = ['sun', 'moon', 'star', 'sky', 'planet']
lengths = {len(w) for w in words}
print(sorted(lengths))

total = sum(n * n for n in range(1, 11))
print(total)

table = [[1, 2, 3], [4, 5, 6]]
flat = [n for row in table for n in row]
print(flat)
▸ Beklenen çıktı
[3, 4, 6]
385
[1, 2, 3, 4, 5, 6]
Son örnekte iki for kısmı var: dıştaki satırları, içteki ise her satırdaki sayıları dolaşır.

Üreteç ifadeleri özellikle any() ve all() fonksiyonlarıyla kullanışlıdır. any(), en az bir eleman koşula uyduğunda; all() ise tüm elemanlar uyduğunda True döndürür. Böylece “Testten kalan var mı?” ya da “Herkes 40 puanın üzerinde mi aldı?” gibi soruları tek satırda cevaplayabilirsin.

Python
scores = [72, 45, 88, 91]
print(any(s < 50 for s in scores))
print(all(s > 40 for s in scores))
print(max(len(w) for w in ['sun', 'planet', 'sky']))
▸ Beklenen çıktı
True
True
6
Örnek: sıcaklık raporu

Bir hafta boyunca Bakü'de gündüz sıcaklıkları: 24, 27, 31, 29, 33, 26, 30 °C. 30 °C ve daha sıcak olan günlerin sayısını bul ve bu sıcaklıkları Fahrenheit'a çevir.

Çözümü göster
Sıcak günleri bir filtreyle seçeriz: hot = [t for t in temps if t >= 30].
Sayılarını len(hot) verir.
Her birini t * 9 / 5 + 32 formülüyle çeviririz: [t * 9 / 5 + 32 for t in hot].
Sonuç aşağıdaki kodda: 3 gün.
Python
temps = [24, 27, 31, 29, 33, 26, 30]
hot = [t for t in temps if t >= 30]
print('Hot days:', len(hot))
print([t * 9 / 5 + 32 for t in hot])
▸ Beklenen çıktı
Hot days: 3
[87.8, 91.4, 86.0]
Alıştırma

Liste üreteçleriyle iki yeni liste oluştur ve yazdır: 1) numbers içindeki tek sayıların kareleri, 2) words içindeki 3 harften uzun kelimeler, büyük harflerle. Her biri tek satırlık bir üreteç olsun.

Alıştırma · Python
numbers = [4, 7, 10, 3, 8, 5]
words = ['sun', 'Baku', 'python', 'sea', 'tea', 'Caspian']
# 1) odd_squares: squares of the odd numbers
# 2) long_words: words longer than 3 letters, in capitals
# print both lists
▸ Beklenen çıktı
[49, 9, 25]
['BAKU', 'PYTHON', 'CASPIAN']
Alıştırma

Bir sözlük üreteciyle results sözlüğünü oluştur: anahtar öğrencinin adı, değer ise puan en az 50 ise 'pass', değilse 'fail' olsun. Onu yazdır. Ardından bir üreteç ifadesi ve sum() ile geçenlerin puanlarının toplamını yazdır.

Alıştırma · Python
scores = {'Aysel': 91, 'Murad': 48, 'Leyla': 76, 'Elvin': 55}
# 1) results: name -> 'pass' or 'fail'
# 2) print results
# 3) print the sum of the scores that are at least 50
▸ Beklenen çıktı
{'Aysel': 'pass', 'Murad': 'fail', 'Leyla': 'pass', 'Elvin': 'pass'}
222

Önemli noktalar

  • [ifade for x in dizi] yeni bir listeyi tek satırda oluşturur.
  • Sondaki if elemanları süzer; for'dan önceki A if koşul else B ise onları iki şekilde dönüştürür.
  • {k: v for ...} sözlük, {x for ...} ise küme oluşturur.
  • sum(x * x for x in ...) gibi bir üreteç ifadesi ayrı bir liste oluşturmaz.
  • Üreteç karmaşıklaşırsa sıradan bir döngüye dön.

Kendini test et

10 soru. Her doğru cevap XP kazandırır.

1 / 10
[n * 2 for n in range(3)] neye eşittir?