Demetler

Demetler, bir önceki bölümde incelediğimiz listelere çok benzer. Ama listeler ile aralarında çok temel bir fark vardır. Listeler üzerinde oynamalar yapabiliriz. Yani öğe ekleyebilir, öğe çıkarabiliriz. Demetlerde ise böyle bir şey yoktur.

Demeti şu şekilde tanımlıyoruz:

>>> demet = "Ali", "Veli", 49, 50

Gördüğünüz gibi, yaptığımız bu iş değişken tanımlamaya çok benziyor. İstersek demetin öğelerini parantez içinde de gösterebiliriz:

>>> demet2 = ("Ali", "Veli", 49, 50)

Parantezli de olsa parantezsiz de olsa yukarıda tanımladıklarımızın ikisi de “demet” sınıfına giriyor. İsterseniz bu durumu teyit edelim:

>>> type(demet)

<type 'tuple'>

>>> type(demet2)

<type 'tuple'>

tuple kelimesi Türkçe’de demet anlamına gelir...

Peki boş bir demet nasıl oluşturulur? Çok basit:

>>> demet = ()

Peki tek öğeli bir demet nasıl oluşturulur? O kadar basit değil. Aslında basit ama biraz tuhaf:

>>> demet = ("su",)

Gördüğünüz gibi, tek öğeli bir demet oluşturabilmek için öğenin yanına bir virgül koyuyoruz! Hemen teyit edelim:

>>> type(demet)

<type 'tuple'>

O virgülü koymazsak ne olur?

>>> demet2 = ("su")

demet2’nin tipini kontrol edelim:

>>> type(demet2)

<type 'str'>

Demek ki, virgülü koymazsak demet değil, alelade bir karakter dizisi oluşturmuş oluyoruz.

Yukarıda anlattığımız şekilde bir demet oluşturma işine demetleme (packing) adı veriliyor. Bunun tersini de yapabiliriz. Buna da demet çözme deniyor (unpacking).

Önce demetleyelim:

>>> aile = "Anne", "Baba", "Kardesler"

Şimdi demeti çözelim:

>>> a, b, c = aile

Bu şekilde komut satırına print a yazarsak, Anne öğesi; print b yazarsak Baba öğesi; print c yazarsak Kardesler öğesi ekrana yazdırılacaktır. Demet çözme işleminde dikkat etmemiz gereken nokta, eşittir işaretinin sol tarafında demetteki öğe sayısı kadar değişken adı belirlememiz gerektiğidir.

Önceki bölümde gördüğümüz enumerate() fonksiyonunu hatırlıyorsunuz. Bu fonksiyonu şöyle bir örnek içinde kullanabileceğimizi de biliyorsunuz:

>>> liste = dir(list)

>>> for a, b in enumerate(liste):
...     print a, b

Bu da aslında bir demet çözme işlemidir. Bildiğiniz gibi enumerate() fonksiyonu bir demet üretir. Bunu hemen teyit edelim:

>>> liste = dir(list)

>>> for i in enumerate(liste):
...     print type(i)
...
<type 'tuple'>

Gördüğünüz gibi elde ettiğimiz şey bir demet. Dolayısıyla print a dediğimiz zaman bu demetin ilk öğesini, print b dediğimiz zaman da ikinci öğesini ekrana yazdırmış oluyoruz.

En başta da dediğimiz gibi, demetler listelere çok benzer. “Peki, listeler varken bu demetler ne işe yarar?” diye sorduğunuzu duyar gibiyim.

Bir defa, demetler listelerin aksine değişiklik yapmaya müsait olmadıklarından listelere göre daha güvenlidirler. Yani yanlışlıkla değiştirmek istemediğiniz veriler içeren bir liste hazırlamak istiyorsanız demetleri kullanabilirsiniz. Ayrıca demetler listelere göre daha hızlı çalışır. Dolayısıyla bir program içinde sonradan değiştirmeniz gerekmeyecek verileri gruplamak için liste yerine demet kullanmak daha mantıklıdır.

Demetlerin Metotları

Demetler üzerinde değişiklik yapmak mümkün olmadığı için bu veri tipi metot bakımından da bir hayli fakirdir. Şu komutlardan herhangi biri yardımıyla demetlerin metotlarını görebileceğimizi biliyoruz:

>>> demet = ()

>>> dir(demet)

>>> dir(tuple)

>>> dir(())

Bu komutlar bize şu çıktıyı verir:

['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__',
'__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__',
'__getslice__', '__gt__', '__hash__', '__init__', '__iter__', '__le__',
'__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__',
'__reduce_ex__', '__repr__', '__rmul__', '__setattr__', '__sizeof__',
'__str__', '__subclasshook__', 'count', 'index']

Burada bizi ilgilendirenler başında ve sonunda “_” işareti barındırmayanlar. Yani şunlar:

count
index

Demet Öğelerinin Sırasını Bulmak

Tıpkı listelerde olduğu gibi, demetlerde de sıra bulma işlemleri için index() metodunu kullanıyoruz. Örneğin:

>>> demet = ("gül", "papatya", "kasımpatı", "erguvan")

>>> demet.index("gül")

0

Demek ki gül adlı öğe demetin 0. sırasında imiş... Yine tıpkı listelerde olduğu gibi bu metot sadece ilk bulduğu öğeyi dikkate alır. Burada da parantez içinde ikinci bir değer kullanabilirsiniz:

>>> demet.index("gül", 2)

Demet Öğelerinin Sayısını Bulmak

Python’da bir demet içindeki öğelerin sayısını bulmak için, tıpkı listelerde olduğu gibi, count() adlı bir metottan yararlanıyoruz. Bu metot bir öğenin demet içinde kaç kez geçtiğini bildirir:

>>> demet = ("erik", "çilek", "karpuz", "erik", "kavun", "karpuz", "çilek")

>>> demet.count("erik")

2

Bölüm Soruları

1. Listelerin aksine demetler üzerinde değişiklik yapılamamamasının ne gibi avantajları olabileceği üzerinde düşünün.

2. Demetlerin bütün metotlarını numaralandıran ve her metottaki karakter sayısını gösteren bir program yazın. Programınız şöyle bir çıktı vermeli:

No      Metot Adı         Metot Uzunluğu
0       __add__                  7
1       __class__                9
2       __contains__             12
3       __delattr__              11
4       __doc__                  7
5       __eq__                   6

3. Bir önceki soruda, numaralandırmayı 0 yerine 1’den başlatmak için ne yapmanız gerekir?

4. Diyelim ki elimizde şöyle bir liste var:

liste = ["elma", "armut", "elma", "kiraz",
         "çilek", "kiraz", "elma", "kebap"]

Bu listedeki her bir öğenin, listede kaç kez geçtiğini söyleyen bir program yazın. Programınız tam olarak şöyle bir çıktı vermeli:

elma öğesi listede 3 kez geçiyor!
armut öğesi listede 1 kez geçiyor!
kiraz öğesi listede 2 kez geçiyor!
çilek öğesi listede 1 kez geçiyor!
kebap öğesi listede 1 kez geçiyor!