Hata Yakalama
12.3 Dondurulmu¸ s Kümeler (Frozenset)
Daha önce de söyledi˘gimiz gibi, kümeler üzerinde de˘gi¸siklik yapabiliyoruz. Zaten kümelerin add()ve remove() gibi metotlarının olması bu durumu teyit ediyor. Ancak kimi durumlarda, ö˘geleri üzerinde de˘gi¸siklik yapılamayan kümelere de ihtiyaç duyabilirsiniz. Hatırlarsanız listeler ve demetler arasında da buna benzer bir ili¸ski var. Demetler ço˘gu zaman, üzerinde de˘gi¸siklik yapılamayan bir liste gibi davranır. ˙I¸ste Python aynı imkanı bize kümelerde de sa˘glar. E˘ger ö˘geleri üzerinde de˘gi¸siklik yapılamayan bir küme olu¸sturmak isterseniz set() yerine frozenset() fonksiyonunu kullanabilirsiniz. Dilerseniz hemen bununla ilgili bir örnek verelim:
>>> dondurulmus = frozenset(["elma", "armut", "ayva"])
Dondurulmu¸s kümeleri bu ¸sekilde olu¸sturuyoruz. ¸Simdi bu dondurulmu¸s kümenin metotlarına bakalım:
>>> dir(dondurulmus)
[’__and__’, ’__class__’, ’__contains__’, ’__delattr__’, ’__doc__’, ’__eq__’,
’__format__’, ’__ge__’, ’__getattribute__’, ’__gt__’, ’__hash__’, ’__init__’,
’__iter__’, ’__le__’, ’__len__’, ’__lt__’, ’__ne__’, ’__new__’, ’__or__’,
’__rand__’, ’__reduce__’, ’__reduce_ex__’, ’__repr__’, ’__ror__’, ’__rsub__’,
’__rxor__’, ’__setattr__’, ’__sizeof__’, ’__str__’, ’__sub__’,
’__subclasshook__’, ’__xor__’, ’copy’, ’difference’, ’intersection’,
’isdisjoint’, ’issubset’, ’issuperset’, ’symmetric_difference’, ’union’]
Gördü˘günüz gibi, add(), remove(), update() gibi, de˘gi¸siklik yapmaya yönelik metotlar listede yok.
Dondurulmu¸s kümeler ile normal kümeler arasında i¸slev olarak hiçbir fark yoktur. Bu ikisi arasındaki fark, listeler ile demetler arasındaki fark gibidir.
12.4 Bölüm Soruları
1. Liste, demet, sözlük ve kümeleri kar¸sıla¸stırdı˘gınızda, bu veri tiplerini olu¸sturma bakımından kümelerle öteki veri tipleri arasında nasıl bir fark görüyorsunuz?
2. Bir küme içinde herhangi bir ö˘genin bulunup bulunmadı˘gını nasıl sorgulayabilece˘gimizi gösteren bir örnek kod yazın.
3. Karakter dizilerini, demetleri ve listeleri kullanarak küme olu¸sturabiliyoruz. Ancak aynı ¸seyi sayıları kullanarak yapamıyoruz. Sayılardan küme olu¸sturmak istedi˘gimizde ¸söyle bir hata mesajı veriyor bize Python:
>>> a = 10
>>> set(a)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: ’int’ object is not iterable
Burada Python bize kabaca ¸söyle bir ¸sey söylemi¸s oluyor: “Sayılar üzerinde döngü
kurulamaz!”. Aldı˘gınız bu hata mesajının anlamı üzerinde dü¸sünün. Bu hatayı ba¸ska hangi durumlarda alırsınız?
4. Kullanıcıya renk adları soran bir program yazın. Kullanıcıdan gelen renk adlarını programın sonunda kullanıcıya bildirin. Ancak kullanıcının girdi˘gi her renk adı kendisine bir kez
bildirilmeli, yani renk adları tekrar etmemeli.
5. Demetler bölümünde ¸söyle bir soru sormu¸stuk:
Diyelim ki elimizde ¸söyle bir liste var:
liste = ["elma", "armut", "elma", "kiraz",
"çilek", "kiraz", "elma", "kebap"]
Bu listedeki her bir ö˘genin, listede kaç kez geçti˘gini söyleyen bir program yazın. Programınız tam olarak ¸söyle bir çıktı vermeli:
elma ö˘gesi listede 3 kez geçiyor!
armut ö˘gesi listede 1 kez geçiyor!
kiraz ö˘gesi listede 2 kez geçiyor!
çilek ö˘gesi listede 1 kez geçiyor!
kebap ö˘gesi listede 1 kez geçiyor!
Kümeler bölümünde ö˘grendi˘giniz bilgileri de dikkate alarak bu programı yeniden yazın.
BÖLÜM
13
Fonksiyonlar
¸
Simdi ¸söyle bir dü¸sünün: Diyelim ki çalı¸stı˘gınız i¸syerinde her gün bir yerlere dilekçe
gönderiyorsunuz. Aslında farklı yerlere gönderdi˘giniz bu dilekçeler temel olarak aynı içeri˘ge sahip. Yani mesela dilekçeyi Mehmet Bey’e gönderece˘giniz zaman yazıya Mehmet Bey’in adını; Ahmet Bey’e gönderece˘giniz zaman ise Ahmet Bey’in adını yazıyorsunuz. Ayrıca tabii dilekçe üzerindeki tarih bilgilerini de güne göre düzenliyorsunuz. Mantıklı bir insan, yukarıdaki gibi bir durumda elinde bir dilekçe tasla˘gı bulundurur ve sadece de˘gi¸stirmesi gereken
kısımları de˘gi¸stirip dilekçeyi hazır hale getirir. Her defasında aynı bilgileri en ba¸stan yazmaz.
Dilerseniz anlattı˘gımız bu durumu Python programlama dili ile temsil etmeye çalı¸salım:
#!/usr/bin/env python
# coding: utf-8 -*-print """Sayın Mehmet Bey,
19.12.2009 tariginde yaptı˘gımız ba¸svurunun sonuçlandırılması hususunda yardımlarınızı rica ederiz.
Saygılarımızla, Orçun Kunek"""
Bu dilekçe Mehmet Bey’e gidiyor. ˙Isterseniz bir tane de Ahmet Bey’e yazalım...
#!/usr/bin/env python
# coding: utf-8 -*-print """Sayın Ahmet Bey,
15.01.2010 tariginde yaptı˘gımız ba¸svurunun sonuçlandırılması hususunda yardımlarınızı rica ederiz.
Saygılarımızla, Orçun Kunek"""
Burada dikkat ederseniz iki dilekçenin metin içeri˘gi aslında aynı. Sadece bir-iki yer de˘gi¸siyor.
Bu kodları bu ¸sekilde yazmak oldukça verimsiz bir yoldur. Çünkü bu sistem hem programcıya çok vakit kaybettirir, hem fazlasıyla kopyala-yapı¸stır i¸slemi gerektirir, hem de bu kodların bakımını yapmak çok zordur. E˘ger dilekçe metni üzerinde bir de˘gi¸siklik yapmak isterseniz program içindeki ilgili kodları tek tek bulup düzeltmeniz gerekir. Yani mesela yukarıdaki iki dilekçenin aynı program içinde oldu˘gunu varsayarsak, dilekçe metnindeki bir hatayı
142
düzeltmek istedi˘gimizde aynı düzeltmeyi birkaç farklı yerde yapmamız gerekir. Örne˘gin yukarıdaki dilekçe metninde bir yazım hatası var. ˙Ilk satırda “tarihinde” yazaca˘gımıza
“tariginde” yazmı¸sız... Tabii biz Mehmet Bey’e yazdı˘gımız dilekçenin metnini Ahmet Bey’e yazaca˘gımız dilekçeyi hazırlarken kopyala-yapı¸stır yaptı˘gımız için aynı hata Mehmet Bey’e gidecek dilekçede de var. ¸Simdi biz bu yazım hatasını düzeltmek istedi˘gimizde, bütün dilekçe metinlerini tek tek gözden geçirmemiz gerekecektir. Hele bir de dilekçe sayısı çok fazlaysa bu i¸slemin ne kadar zor olaca˘gını bir dü¸sünün. Tabii bu basit durum için, her metin düzenleyicide bulunan “bul-de˘gi¸stir” özelli˘gini kullanabiliriz. Ama i¸sler her zaman bu kadar kolay
olmayabilir. Bu bakım ve taslaklama i¸sini kolayla¸stıracak bir çözüm olsa ve bizi aynı ¸seyleri tekrar tekrar yazmaktan kurtarsa ne kadar güzel olurdu, de˘gil mi? ˙I¸ste Python buna benzer durumlar için bize “fonksiyon” denen bir araç sunar. Biz de bu bölümde bu faydalı aracı nasıl kullanaca˘gımızı ö˘grenecek ve bu aracı olabildi˘gince ayrıntılı bir ¸sekilde incelemeye
çalı¸saca˘gız.