- Bir döngüyü liste üreteciyle değiştirmek
- Üretece filtre koşulu ve
if ... elseifadesi 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:
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]
[expression for item in iterable if condition]
{key: value for item in iterable if condition}
{expression for item in iterable}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:
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.
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ı:
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.
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]
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.
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
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Çözümü gizle
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.
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]
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.
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']
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.
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
ifelemanları süzer;for'dan öncekiA if koşul else Bise 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.
[n * 2 for n in range(3)] neye eşittir?