
BÖLÜM 6 — Çeşitliliğin Doğuşu: Her Veri Bir Liste Olmak Zorunda mı?
Bu bölümün temel sorusuBeşinci derste listelerle birden fazla veriyi bir arada tutmayı öğrendik. Peki bir veri hiç değişmemeli mi? Ya da bir veriye index numarasıyla değil, bir isimle mi ulaşmak istiyoruz? Liste her zaman doğru araç mı?
🎯 Bölümün Öğrenme Hedefleri
Bu dersin sonunda öğrenci;
- listenin her problemi çözmediğini, hangi durumlarda yetersiz kaldığını,
- demetlerin (tuple) "değiştirilemezlik" ihtiyacından nasıl doğduğunu,
- sözlüklerin (dict) index yerine anahtar (key) kullanma fikrinin hangi problemi çözdüğünü,
- kümelerin (set) tekrarsızlık garantisinin nereden geldiğini,
- dört veri yapısı (liste, demet, sözlük, küme) arasında nasıl doğru seçim yapılacağını
📌 Geçen Derste Neler Öğrendik?
Beşinci derste listeleri ("[ ]") öğrendik. Birden fazla veriyi tek bir isimde, sırayla, index ile erişilebilir şekilde tutmayı. Ayrıca listelerin değiştirilebilir (mutable) olduğunu, yani tanımlandıktan sonra bile eleman eklenip çıkarılabildiğini gördük. Bu bölümde, tam olarak bu "değiştirilebilirlik" özelliğinin bazen istenmediği durumlardan yola çıkıyoruz.
6.1. Her Şey Bir Sorunla Başladı (Demetler İçin)
Diyelim ki bir noktanın koordinatlarını tutuyorsun: "(enlem, boylam)". Bu iki değer bir kere belirlendikten sonra asla değişmemelidir . Bir şehrin koordinatları programın ortasında yanlışlıkla değiştirilirse, bu ciddi bir hataya yol açar.Kod:
koordinat = [41.0082, 28.9784] # liste kullanırsak...
koordinat[0] = 999 # bu değişikliği hiçbir şey engellemez!6.2. Büyük Fikir: Değiştirilemezlik Bir Kısıtlama Değil, Bir Garantidir
Kod:
koordinat = (41.0082, 28.9784)
print(koordinat[0]) # 41.0082 -- okumak serbest
koordinat[0] = 999 # HATA! 'tuple' object does not support item assignmentBİLGİ
🤔 Neden Bu "Kısıtlama" Aslında Bir Özellik?
Çünkü bir veriyi "değiştirilemez" olarak işaretlemek, kodu okuyan herkese (ve bir yıl sonraki sana) açık bir mesaj verir: "bu veri sabittir, güvenle kullanabilirsin, kimse arkadan değiştirmeyecek." Bu, tıpkı bir sözleşmenin mürekkeple değil kurşun kalemle değil, silinemez bir şekilde yazılması gibidir güven verir.
Çünkü bir veriyi "değiştirilemez" olarak işaretlemek, kodu okuyan herkese (ve bir yıl sonraki sana) açık bir mesaj verir: "bu veri sabittir, güvenle kullanabilirsin, kimse arkadan değiştirmeyecek." Bu, tıpkı bir sözleşmenin mürekkeple değil kurşun kalemle değil, silinemez bir şekilde yazılması gibidir güven verir.
6.3. Her Şey Bir Sorunla Başladı (Sözlükler İçin)
Şimdi farklı bir soruna bakalım. Bir öğrencinin bilgilerini tutmak istiyorsun: adı, yaşı, notu. Liste ile şöyle yapardık:Kod:
ogrenci = ["Ahmet", 20, 85]
print(ogrenci[0]) # Ahmet
print(ogrenci[1]) # 20
print(ogrenci[2]) # 856.4. Büyük Fikir: Sayı Yerine İsimle Erişim
Kod:
ogrenci = {
"isim": "Ahmet",
"yas": 20,
"not": 85
}
print(ogrenci["isim"]) # Ahmet
print(ogrenci["yas"]) # 20
print(ogrenci["not"]) # 85BİLGİ
💡 Büyük Fikir: Liste "bu kaçıncı sırada?" sorusuna göre organize olurken, sözlük "bu neyin karşılığı?" sorusuna göre organize olur. Bu, gerçek hayattaki bir sözlüğe (kelime kitabı) çok benzer, kelimeleri sayfa numarasıyla değil, kelimenin kendisiyle ararsın.
6.5. Sözlükte Değer Güncelleme ve Ekleme
Kod:
ogrenci = {"isim": "Ahmet", "yas": 20}
ogrenci["yas"] = 21 # var olan bir anahtarı güncelle
ogrenci["sehir"] = "İstanbul" # yeni bir anahtar-değer ekle
print(ogrenci)
# {'isim': 'Ahmet', 'yas': 21, 'sehir': 'İstanbul'}DERSTE
⚠️ Dikkat — Olmayan Bir Anahtara Erişmek:
Bu hatadan kaçınmak için ".get()" metodunu kullanabilirsin anahtar yoksa hata vermez, "None" (ya da belirttiğin bir varsayılan değer) döndürür:
Kod:
print(ogrenci["boy"]) # HATA! KeyError -- böyle bir anahtar yokBu hatadan kaçınmak için ".get()" metodunu kullanabilirsin anahtar yoksa hata vermez, "None" (ya da belirttiğin bir varsayılan değer) döndürür:
Kod:
print(ogrenci.get("boy")) # None
print(ogrenci.get("boy", "bilinmiyor")) # bilinmiyor6.6. Sözlükte Döngü: "for" Bu Sefer Neyi Gezer?
Kaynak kod
Kod:
ogrenci = {"isim": "Ahmet", "yas": 20, "sehir": "İstanbul"}
for anahtar in ogrenci:
print(anahtar)Çıktı
isim
yas
sehir
DERSTE
🤔 Neden Sadece Anahtarlar Geldi?
Çünkü Python'da bir sözlük üzerinde doğrudan "for" döngüsü kurarsan, varsayılan olarak sadece anahtarları gezersin. Hem anahtar hem değeri istiyorsan ".items()" kullanman gerekir:
Bu, beşinci dersteki "enumerate()" mantığına çok benzer orada index+eleman ikilisi alıyorduk, burada anahtar+değer ikilisi alıyoruz.
Çünkü Python'da bir sözlük üzerinde doğrudan "for" döngüsü kurarsan, varsayılan olarak sadece anahtarları gezersin. Hem anahtar hem değeri istiyorsan ".items()" kullanman gerekir:
Kaynak kod
Kod:
for anahtar, deger in ogrenci.items():
print(anahtar, ":", deger)Çıktı
isim : Ahmet
yas : 20
sehir : İstanbul
6.7. Her Şey Bir Sorunla Başladı (Kümeler İçin)
Son bir problem daha: Diyelim ki bir etkinliğe katılan kişilerin isimlerini tutuyorsun, ama biri yanlışlıkla aynı ismi iki kere kaydetmiş olabilir:Kod:
katilimcilar = ["Ahmet", "Ayşe", "Ahmet", "Mehmet", "Ayşe"]Burada "Ahmet" ve "Ayşe" tekrar ediyor oysa katılımcı listesi mantığen tekrar içermemeli. Listeyle bu tekrarları elle temizlemek gerekir. İşte bu problem —"tekrarsız veri tutma ihtiyacı"— kümeleri (set) doğurur.
Kod:
katilimcilar = {"Ahmet", "Ayşe", "Ahmet", "Mehmet", "Ayşe"}
print(katilimcilar)
# {'Ahmet', 'Ayşe', 'Mehmet'} -- tekrarlar otomatik olarak silindi!BİLGİ
💡 Büyük Fikir: Küme, matematikteki küme kavramından doğrudan ilham alır. Bir kümede her eleman en fazla bir kere bulunabilir. Python bu kuralı otomatik olarak uygular; siz tekrar ekleseniz bile küme bunu görmezden gelir.
DİKKAT
⚠️ Dikkat: Kümeler sözlük gibi "{ }" kullanır ama anahtar-değer çifti yoktur, sadece tekil değerler vardır. Ayrıca kümelerde sıralama garantisi yoktur . Bir kümeyi yazdırdığında elemanların hangi sırayla çıkacağı garanti edilmez (listedeki gibi index ile de erişemezsin).
6.8. Dört Veri Yapısını Yan Yana Koyalım
Şimdiye kadar öğrendiğimiz dört veri yapısını, hangi soruna cevap verdikleri üzerinden karşılaştıralım:| Veri Yapısı | Sözdizimi | Sıralı mı? | Değiştirilebilir mi? | Tekrar İçerebilir mi? | Ne Zaman Kullanılır? |
| Liste | "[ ]" | Evet | Evet | Evet | Sıralı, değişebilir bir veri kümesi (öğrenci listesi) |
| Demet | "()" | Evet | Hayır | Evet | Asla değişmemesi gereken sabit veri (koordinat) |
| Sözlük | "{ key: value }" | Evet (3.7+) | Evet | Anahtar tekrar edemez | İsimle erişilecek veri (bir kişinin bilgileri) |
| Küme | "{ }" | Hayır | Evet | Hayır | Tekrarsız, sırasız veri (benzersiz katılımcılar) |
DİKKAT
🤔 Bu Tablo Neden Önemli?
Çünkü yeni başlayanların en sık düştüğü tuzaklardan biri, her durumda liste kullanmaya çalışmaktır. Oysa doğru veri yapısını seçmek, kodunu hem daha güvenli (demet: yanlışlıkla değiştirilemez) hem daha okunabilir (sözlük: index yerine isim) hem de daha doğru (küme: tekrarsızlık garantisi) hâle getirir.
Çünkü yeni başlayanların en sık düştüğü tuzaklardan biri, her durumda liste kullanmaya çalışmaktır. Oysa doğru veri yapısını seçmek, kodunu hem daha güvenli (demet: yanlışlıkla değiştirilemez) hem daha okunabilir (sözlük: index yerine isim) hem de daha doğru (küme: tekrarsızlık garantisi) hâle getirir.
⚠️ Kavram Yanılgıları
❌ Yanlış düşünce: "Demet, sadece parantez türü değişmiş bir listedir, aralarında pratik bir fark yoktur."✅ Daha doğru düşünce: Demetin temel amacı değiştirilemezliktir (immutability). Bu, sadece bir sözdizimi tercihi değil, "bu veri asla değişmemeli" niyetini koda kodlamanın yoludur.
❌ Yanlış düşünce: "Sözlükte de listedeki gibi `ogrenci[0]` şeklinde index ile erişebilirim."
✅ Daha doğru düşünce: Sözlükte erişim index ile değil, anahtarla (`ogrenci["isim"]`) yapılır. Sayısal bir anahtar tanımlamadıysan (`{0: "Ahmet"}` gibi özel bir durum hariç), `ogrenci[0]` hataya yol açar.
❌ Yanlış düşünce: "Küme de sözlük gibidir çünkü ikisi de `{ }` kullanır."
✅ Daha doğru düşünce: Sözlükte anahtar-değer çiftleri vardır (`{"isim": "Ahmet"}`), kümede ise sadece tekil değerler vardır (`{"Ahmet", "Ayşe"}`). Sözdizimi benzer görünse de kavramsal olarak farklı problemleri çözerler.
👨🏫 Öğretmen Notu
Bu dersin en büyük pedagojik riski, dört farklı veri yapısını art arda vermenin öğrenciyi bunaltmasıdır. Bunu önlemenin yolu, her yapıyı bir önceki yapının yetersiz kaldığı somut bir senaryo ile açmaktır:- Liste zaten biliniyor "peki ya değişmemesi gerekiyorsa?" sorusuyla demete geçilir.
- "Peki ya index yerine isimle erişmek istiyorsak?" sorusuyla sözlüğe geçilir.
- "Peki ya tekrarları otomatik engellemek istiyorsak?" sorusuyla kümeye geçilir.
- Ders sonunda mutlaka bir karşılaştırma tablosu verilmeli, öğrenci "hangisini ne zaman kullanacağım" sorusuna cevapsız kalmamalı.
✍️ Uygulama Soruları
Soru 1: Bir dikdörtgenin genişlik ve yüksekliğini, değiştirilemez şekilde tutan bir demet oluşturunuz.Soru 2: Bir kitabın adı, yazarı ve sayfa sayısını tutan bir sözlük oluştur ve yazarını yazdır.
Soru 3: Aşağıdaki liste içindeki tekrarlı renkleri bir küme kullanarak tekilleştir.
Kod:
renkler = ["kırmızı", "mavi", "kırmızı", "yeşil", "mavi"]Soru 4: Aşağıdaki kod neden hata verir?
Kod:
koordinat = (10, 20)
koordinat[0] = 99Soru 5: Bir sözlükteki tüm anahtar-değer çiftlerini "for" döngüsüyle "anahtar: değer" formatında yazdır.
Kod:
kisi = {"isim": "Elif", "sehir": "Ankara"}📌 Şu Ana Kadar Neler Öğrendik?
- Listenin her problemi çözmediği, veri yapısı seçiminin de programlamanın bir parçası olduğu
- Demetlerin ("( )") değiştirilemezlik garantisi sunduğu ve bunun neden bir avantaj olduğu
- Sözlüklerin ("{ key: value }") index yerine anlamlı bir isimle (anahtar) veriye erişmeyi sağladığı
- ".get()" metodunun olmayan bir anahtara erişirken hatayı nasıl önlediği
- ".items()" ile sözlükte hem anahtar hem değeri aynı anda gezebildiğimiz
- Kümelerin ("{ }", anahtarsız) otomatik olarak tekrarları elediği ve sırasız olduğu
- Dört veri yapısını (liste, demet, sözlük, küme) hangi kritere göre seçeceğimiz
📌 Bu Bölümden Çıkarılacak En Önemli Sonuç
Her veri yapısı bir formülle değil, listenin yetersiz kaldığı somut bir problemle doğdu:- değişmemesi gereken veri (demet),
- isimle erişilmesi gereken veri (sözlük),
- tekrarsız olması gereken veri (küme).
📝 Bölümün Kısa Özeti
Liste her zaman yeterli değildir. Demetler ('( )') değiştirilemez veri için, sözlükler ('{ key: value }') anahtar üzerinden erişilen veri için, kümeler ('{ }', anahtarsız) tekrarsız veri için tasarlanmıştır. Sözlükte veriye `sozluk["anahtar"]` ile erişilir, `.get()` ile güvenli erişim sağlanır, `.items()` ile hem anahtar hem değer aynı anda gezilir. Kümeler otomatik olarak tekrarları eler ama sıralama garantisi vermez. Doğru veri yapısını seçmek, kodun hem güvenliğini hem okunabilirliğini artırır.✍️ Uygulama Cevapları
Cevap 1:Kod:
boyut = (10, 5)
print(boyut[0], boyut[1])
# Çıktı: 10 5Cevap 2:
Kod:
kitap = {"ad": "Simyacı", "yazar": "Paulo Coelho", "sayfa": 208}
print(kitap["yazar"])
# Çıktı: Paulo CoelhoCevap 3:
Kod:
renkler = ["kırmızı", "mavi", "kırmızı", "yeşil", "mavi"]
tekil_renkler = set(renkler)
print(tekil_renkler)
# Çıktı: {'kırmızı', 'mavi', 'yeşil'}Cevap 4: Çünkü demetler değiştirilemezdir (immutable). Bir kere oluşturulduktan sonra elemanlarına yeni değer atanamaz. Bu, demetin tam olarak var olma amacıdır.
Cevap 5:
Kod:
kisi = {"isim": "Elif", "sehir": "Ankara"}
for anahtar, deger in kisi.items():
print(anahtar, ":", deger)
# Çıktı:
# isim : Elif
# sehir : Ankara
Her Veri Bir Liste Olmak Zorunda mı? (Python 6.Ders)
