• Sonuç bulunamadı

Dondurulmu¸ s Kümeler (Frozenset)

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.