Sözlüğün ne demek olduğunu tanımlamadan önce gelin isterseniz işe bir örnekle başlayalım:
Burada mesela, elma bir anahtar, meyve ise bu anahtarın değeridir. Aynı şekilde sebze değerinin anahtarı domatestir. Dolayısıyla Pythonda sözlük; anahtar ve değer arasında bağ kuran bir veri tipidir.
Mesela bir adres veya telefon defteri yazmak istediğimizde bu sözlüklerden faydalanabiliriz. Yani sözlük denince aklımıza sadece bildiğimiz sözlükler gelmemeli. Şu örneğe bir bakalım:
Burada kodlarımızın sağa doğru biçimsiz bir biçimde uzamaması için virgülden sonra ENTER tuşuna basarak öğeleri tanımlamaya devam ettiğimize dikkat edin. Sağa doğru çok fazla uzamış olan kodlar hem görüntü açısından hoş değildir, hem de görüş alanını dağıttığı için okumayı zorlaştırır.
Sözlük tanımlarken dikkat etmemiz gereken birkaç nokta var. Bunlardan birincisi öğeleri belirlerken küme parantezlerini kullanıyor olmamız. İkincisi karakter dizilerinin yanısıra sayıları da tırnak içinde gösteriyor olmamız. İsterseniz sayıları tırnaksız kullanırsanız ne olacağını deneyerek görebilirsiniz. Ancak eğer gireceğiniz sayı çok uzun değil ve 0 ile başlamıyorsa bu sayıyı tırnaksız da yazabilirsiniz. Üçüncüsü iki nokta üst üste ve virgüllerin nerede, nasıl kullanıldığına da dikkat etmeliyiz. Şimdi gelelim sözlüklerle neler yapabileceğimize...
Şu komuta bir bakalım:
veya:
Bu komutlar Ahmet ve Salih adlı anahtarların karşısında hangi değer varsa onu ekrana yazdıracaktır. Dikkat edin, sözlükten öğe çağırırken küme parantezlerini değil, köşeli parantezleri kullanıyoruz. Bu arada aklınızda bulunsun, sözlük içindeki öğeleri anahtara göre çağırıyoruz, değere göre değil. Yani iki nokta üst üste işaretinin solundaki ifadeleri kullanıyoruz öğeleri çağırırken, sağındakileri değil...
Şimdi gelelim bu sözlükleri nasıl yöneteceğimize... Diyelim ki sözlüğümüze yeni bir öğe eklemek istiyoruz:
Peki sözlüğümüzdeki bir öğenin değerini değiştirmek istersek ne yapacağız?
Buradan anladığımız şu: Bir sözlüğe yeni bir öğe eklerken de, varolan bir öğeyi değiştirirken de aynı komutu kullanıyoruz. Demek ki bir öğeyi değiştirirken aslında öğeyi değiştirmiyor, silip yerine yenisini koyuyoruz.
Eğer bir öğeyi listeden silmek istersek şu komutu kullanıyoruz:
Eğer biz sözlükteki bütün öğeleri silmek istersek şu komut kullanılıyor:
Şu son örnekte gördüğümüz clear() ifadesi, Python sözlüklerinin metotlarından biridir. Sözlüklerin bunun dışında başka metotları da vardır. Bunlar içinde en önemlileri ise keys() ve values() adlı metotlardır. Kısaca söylemek gerekirse keys() metodu bir sözlükteki anahtarları, values() metodu ise sözlükteki değerleri verir. Mesela:
Sözlüklerin ne olduğunu ve ne işe yaradığını öğrendiğimize göre, şimdi isterseniz, Python sözlüklerinin pratikliğini bir örnek yardımıyla görmeye çalışalım:
Diyelim ki bir hava durumu programı yazmak istiyoruz. Tasarımıza göre kullanıcı bir şehir adı girecek. Program da girilen şehre özgü hava durumu bilgilerini ekrana yazdıracak. Bunu yapabilmek için, daha önceki bilgilerimizi de kullanarak şöyle bir şey yazabiliriz:
Ama yukarıdaki yöntemin, biraz meşakkatli olacağı açık. Sadece üç şehir için hava durumu bilgilerini sorgulayacak olsak mesele değil, ancak onlarca şehri kapsayacak bir program üretmekse amacımız, yukarıdaki yöntem yerine daha pratik bir yöntem uygulamak gayet yerinde bir tercih olacaktır. İşte bu noktada programcının imdadına Pythondaki sözlük veri tipi yetişecektir. Yukarıdaki kodların yerine getirdiği işlevi, şu kodlarla da gerçekleştirebiliriz:
Gördüğünüz gibi, ilk önce normal biçimde, kullanıcıya sorumuzu soruyoruz. Ardından da anahtar-değer çiftleri şeklinde şehir adlarını ve bunlara karşılık gelen hava durumu bilgilerini bir sözlük içinde depoluyoruz. Daha sonra, sözlük metotlarından biri olan get() metodunu seçiyoruz. Bu metot bize sözlük içinde bir değerin varolup olmadığını denetleme imkânının yanısıra, adı geçen değerin sözlük içinde varolmaması durumunda kullanıcıya gösterilecek bir mesaj seçme olanağı da sunar. Python sözlüklerinde bulunan bu get() metodu bizi bir else veya sonraki derslerimizde işleyeceğimiz try-except bloğu kullanarak hata yakalamaya uğraşma zahmetinden de kurtarır.
Burada print cevap.get(soru,Bu şehre ilişkin hava durumu bilgisi bulunmamaktadır.) satırı yardımıyla soru adlı değişkenin değerinin sözlük içinde varolup varolmadığını sorguluyoruz. Eğer kullanıcının girdiği şehir adı sözlüğümüz içinde bir anahtar olarak tanımlanmışsa, bu anahtarın değeri ekrana yazdırılacaktır. Eğer kullanıcının girdiği şehir adı sözlüğümüz içinde bulunmuyorsa, bu defa kullanıcıya Bu şehre ilişkin hava durumu bilgisi bulunmamaktadır. biçiminde bir mesaj gösterilecektir.
if deyimleri yerine sözlüklerden yararlanmanın, yukarıda bahsedilen faydalarının dışında bir de şu yararları vardır:
Kod:
>>> sozluk = {"elma": "meyve", "domates": "sebze", 1: "sayi"}
Burada mesela, elma bir anahtar, meyve ise bu anahtarın değeridir. Aynı şekilde sebze değerinin anahtarı domatestir. Dolayısıyla Pythonda sözlük; anahtar ve değer arasında bağ kuran bir veri tipidir.
Mesela bir adres veya telefon defteri yazmak istediğimizde bu sözlüklerden faydalanabiliriz. Yani sözlük denince aklımıza sadece bildiğimiz sözlükler gelmemeli. Şu örneğe bir bakalım:
Kod:
>>> telefon_defteri = {"Ahmet": "0533 123 45 67", ... "Salih": "0532321 54 76", ... "Selin": "0533 333 33 33"}
Burada kodlarımızın sağa doğru biçimsiz bir biçimde uzamaması için virgülden sonra ENTER tuşuna basarak öğeleri tanımlamaya devam ettiğimize dikkat edin. Sağa doğru çok fazla uzamış olan kodlar hem görüntü açısından hoş değildir, hem de görüş alanını dağıttığı için okumayı zorlaştırır.
Sözlük tanımlarken dikkat etmemiz gereken birkaç nokta var. Bunlardan birincisi öğeleri belirlerken küme parantezlerini kullanıyor olmamız. İkincisi karakter dizilerinin yanısıra sayıları da tırnak içinde gösteriyor olmamız. İsterseniz sayıları tırnaksız kullanırsanız ne olacağını deneyerek görebilirsiniz. Ancak eğer gireceğiniz sayı çok uzun değil ve 0 ile başlamıyorsa bu sayıyı tırnaksız da yazabilirsiniz. Üçüncüsü iki nokta üst üste ve virgüllerin nerede, nasıl kullanıldığına da dikkat etmeliyiz. Şimdi gelelim sözlüklerle neler yapabileceğimize...
Şu komuta bir bakalım:
Kod:
>>> telefon_defteri["Ahmet"]
veya:
Kod:
>>> telefon_defteri["Salih"]
Bu komutlar Ahmet ve Salih adlı anahtarların karşısında hangi değer varsa onu ekrana yazdıracaktır. Dikkat edin, sözlükten öğe çağırırken küme parantezlerini değil, köşeli parantezleri kullanıyoruz. Bu arada aklınızda bulunsun, sözlük içindeki öğeleri anahtara göre çağırıyoruz, değere göre değil. Yani iki nokta üst üste işaretinin solundaki ifadeleri kullanıyoruz öğeleri çağırırken, sağındakileri değil...
Şimdi gelelim bu sözlükleri nasıl yöneteceğimize... Diyelim ki sözlüğümüze yeni bir öğe eklemek istiyoruz:
Kod:
telefon_defteri["Zekiye"] = "0544 444 01 00"
Peki sözlüğümüzdeki bir öğenin değerini değiştirmek istersek ne yapacağız?
Kod:
telefon_defteri["Salih"] = "0555 555 55 55"
Buradan anladığımız şu: Bir sözlüğe yeni bir öğe eklerken de, varolan bir öğeyi değiştirirken de aynı komutu kullanıyoruz. Demek ki bir öğeyi değiştirirken aslında öğeyi değiştirmiyor, silip yerine yenisini koyuyoruz.
Eğer bir öğeyi listeden silmek istersek şu komutu kullanıyoruz:
Kod:
del telefon_defteri["Salih"]
Eğer biz sözlükteki bütün öğeleri silmek istersek şu komut kullanılıyor:
Kod:
telefon_defteri.clear()
Şu son örnekte gördüğümüz clear() ifadesi, Python sözlüklerinin metotlarından biridir. Sözlüklerin bunun dışında başka metotları da vardır. Bunlar içinde en önemlileri ise keys() ve values() adlı metotlardır. Kısaca söylemek gerekirse keys() metodu bir sözlükteki anahtarları, values() metodu ise sözlükteki değerleri verir. Mesela:
Kod:
>>> print telefon_defteri.keys() ['Ahmet', 'Salih', 'Selin'] >>> print telefon_defteri.values() ['0533 123 45 67', '0532 321 54 76', '0533 333 33 33']
Sözlüklerin ne olduğunu ve ne işe yaradığını öğrendiğimize göre, şimdi isterseniz, Python sözlüklerinin pratikliğini bir örnek yardımıyla görmeye çalışalım:
Diyelim ki bir hava durumu programı yazmak istiyoruz. Tasarımıza göre kullanıcı bir şehir adı girecek. Program da girilen şehre özgü hava durumu bilgilerini ekrana yazdıracak. Bunu yapabilmek için, daha önceki bilgilerimizi de kullanarak şöyle bir şey yazabiliriz:
Kod:
#!/usr/bin/env python # -*- coding: utf-8 -*- soru = raw_input("Şehrinizin adını tamamı küçük \ harf olacak şekilde yazınız: ") if soru == "istanbul": print "gök gürültülü ve sağanak yağışlı" elif soru == "ankara": print "açık ve güneşli" elif soru == "izmir": print "bulutlu" else: print "Bu şehre ilişkin havadurumu \ bilgisi bulunmamaktadır."
Ama yukarıdaki yöntemin, biraz meşakkatli olacağı açık. Sadece üç şehir için hava durumu bilgilerini sorgulayacak olsak mesele değil, ancak onlarca şehri kapsayacak bir program üretmekse amacımız, yukarıdaki yöntem yerine daha pratik bir yöntem uygulamak gayet yerinde bir tercih olacaktır. İşte bu noktada programcının imdadına Pythondaki sözlük veri tipi yetişecektir. Yukarıdaki kodların yerine getirdiği işlevi, şu kodlarla da gerçekleştirebiliriz:
Kod:
#!/usr/bin/env python # -*- coding: utf-8 -*- soru = raw_input("Şehrinizin adını tamamı küçük \ harf olacak şekilde yazınız: ") cevap = {"istanbul":"gök gürültülü ve sağanak yağışlı", "ankara":"açık ve güneşli", "izmir":"bulutlu"} print cevap.get(soru,"Bu şehre ilişkin havadurumu \ bilgisi bulunmamaktadır.")
Gördüğünüz gibi, ilk önce normal biçimde, kullanıcıya sorumuzu soruyoruz. Ardından da anahtar-değer çiftleri şeklinde şehir adlarını ve bunlara karşılık gelen hava durumu bilgilerini bir sözlük içinde depoluyoruz. Daha sonra, sözlük metotlarından biri olan get() metodunu seçiyoruz. Bu metot bize sözlük içinde bir değerin varolup olmadığını denetleme imkânının yanısıra, adı geçen değerin sözlük içinde varolmaması durumunda kullanıcıya gösterilecek bir mesaj seçme olanağı da sunar. Python sözlüklerinde bulunan bu get() metodu bizi bir else veya sonraki derslerimizde işleyeceğimiz try-except bloğu kullanarak hata yakalamaya uğraşma zahmetinden de kurtarır.
Burada print cevap.get(soru,Bu şehre ilişkin hava durumu bilgisi bulunmamaktadır.) satırı yardımıyla soru adlı değişkenin değerinin sözlük içinde varolup varolmadığını sorguluyoruz. Eğer kullanıcının girdiği şehir adı sözlüğümüz içinde bir anahtar olarak tanımlanmışsa, bu anahtarın değeri ekrana yazdırılacaktır. Eğer kullanıcının girdiği şehir adı sözlüğümüz içinde bulunmuyorsa, bu defa kullanıcıya Bu şehre ilişkin hava durumu bilgisi bulunmamaktadır. biçiminde bir mesaj gösterilecektir.
if deyimleri yerine sözlüklerden yararlanmanın, yukarıda bahsedilen faydalarının dışında bir de şu yararları vardır:
- Öncelikle sözü geçen senaryo için sözlükleri kullanmak programcıya daha az kodla daha çok iş yapma olanağı sağlar.
- Sözlük programcının elle oluşturacağı if-elif-else bloklarından daha performanslıdır ve bize çok hızlı bir şekilde veri sorgulama imkânı sağlar.
- Kodların daha az yer kaplaması sayesinde programın bakımı da kolaylaşacaktır.
- Tek tek if-elif-else blokları içinde şehir adı ve buna ilişkin hava durumu bilgileri tanımlamaya kıyasla sözlük içinde yeni anahtar-değer çiftleri oluşturmak daha pratiktir.
