[Bölüm 13] Python Dilinde Demet (Tuple) Veri Yapıları

Merhaba arkadaşlar, bu yazımda veri tiplerinden kaldığımız yerden devam edeceğiz. Bu blog yazımda demet (tuple) veri yapılarından bahsedeceğim.

Öncelikle söylemek gerekirse demetler listelerden farklı olarak değiştirilemez veri yapılarıdır ve bu tarz veri yapılarına immutable veri yapıları deriz. Yine aynı şekilde liste veri yapılarında olduğu gibi indisler 0’dan başlar.

tuple e l e k t r i k v a d i s i
indis 0 1 2 3 4 5 6 7 8 9 10 11 12 13
-indis -14 -13 -12 -11 -10 -9 -8 -7 -6 -5 -4 -3 -2 -1

Demet veri yapılarında elemanlar iki parantez arasına yazılır lakin bu parantez zorunlu değildir. Yine aynı şekilde liste veri yapılarında olduğu gibi demetlerde de dilimleme (sliceable) ve iç içe geçirilme (nestable) yapılabilir.

Demet veri yapılarının içerisindeki elemanlar Python dilinde tanımlanan başka bir veri yapısı olabilir. Örnek vermek gerekirse demetin içerisinde bir liste, bir string olabilir.

Şimdi hemen aşağıda demetler ile ilgili özellikleri örnek kodlarla anlatacağım.

Aşağıdaki örnek kodlarda iki tane demet tanımladım ve bu demetlerin içerisine liste ve demet ekledim. Böylece demetlerin dilimlenebilirlik özelliğini örneklemiş oldum.

enerji = ('elektrik',['V','I','Z'],('güneş','rüzgar','nükleer'))
makine = (['asenkron','senkron'],'servo','kontrol devresi',3,1)

Yazımın en başında demet veri yapılarındaki elemanların sonradan değiştirilemeyeceğini söylemiştim. Buradan yola çıkarak demetlerdeki elemanların sonradan atama yoluyla değiştirilemeyeceğini de söylemiş olalım. Yani demetin 5. elemanını şu eleman olsun diyerek sonradan atama ile değiştiremeyiz.

'''Aşağıdaki kodu çalıştırırsanız demete eleman eklemeye çalıştığımız için Python bunu kabul etmeyecek ve bize hata mesajı verecektir.''' 
demet = tuple()
demet[0] = 1

Çıktı:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-2-e7bd90e2c349> in <module>()
      1 demet = tuple()
----> 2 demet[0] = 1

TypeError: 'tuple' object does not support item assignment

Eğer demetin içerisindeki değiştirilebilen bir veri yapısına eleman eklemesi yapmaya çalışırsak Python burada bize hata mesajı vermeyecektir. Yani demetin içerisindeki bir listeye eleman eklemek istersem bunu rahatlıkla yapabilirim.

sayılar = ('abc',[1,2,3,4,5,6,7,8,9],'def')
sayılar[1][0] = 0
print(sayılar)

Çıktı:

('abc', [0, 2, 3, 4, 5, 6, 7, 8, 9], 'def')

Demetler üzerinde dilimleme çok rahat bir şekilde yapılabilir. Hemen aşağıda demetlerdeki dilimlemelerin örnek kodları mevcuttur.

sayılar = (0,1,2,3,4,5,6,7,8,9)
print(sayılar[0])
print(sayılar[1:3])
print(sayılar[1:-3])
print(sayılar[7:9])

Çıktı:

0
(1, 2)
(1, 2, 3, 4, 5, 6)
(7, 8)

Yukarıda demetlere sonradan atama yapılamayacağından bahsettim lakin bu sonradan eleman eklenemeyeceği anlamına gelmesin. Kafanız karışmış olabilir aşağıda hemen bu durumla ilgili örnek verdim.

sayılar = (0,1,2,3,4,5,6,7,8,9) #bir demet tanımladım
ondalık = (10,20,30,40,50,60,70,80,90) #ikinci bir demet tanımladım
yeni_demet = sayılar + ondalık #tanımladığım demetleri topladım
print(yeni_demet) #yeni demeti ekrana yazdırdım

Çıktı:

(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 30, 40, 50, 60, 70, 80, 90)

Aşağıdaki metod ile demetlerin içerisinde aradığımız elemanların olup olmadığını kontrol edebiliriz. Gelen mantıksal cevabı ise yazacağımız algoritmada koşullarda kullanarak yazmaya çalıştığımız programı daha kısa sürede elde edebiliriz.

if 1 in (1,2,3,4,5): #True çıktısı verir
    print(True)
else:
    print(False)

Çıktı:

True

Demet Veri Yapılarında Kullanılan Gömülü Fonksiyonlar

Fonksiyon İşlev
cmp(x,y) x ve y demetlerini karşılaştırır
len(x) x demetinin boyunu (uzunluğunu) verir
max(x) x demetindeki en büyük değerli elemanı çıktı verir
min(x) x demetindeki en küçük değerli elemanı çıktı verir
y = sorted (x) x demetinin elemanlarını sıralayarak y demetini oluşturur
sum(x) x demetinin elemanları birer sayı ise toplamını çıktı verir
tuple(a) a listesini demete dönüştürür

Örnek:

a = (1,3,5,7,9,2,4,6,8)
print("{},{},{}".format(len(a),max(a),min(a)))

b = sorted(a)
print(b)

c = tuple(b)
print(c)

print(sum(a))

Çıktı:

9,9,1
[1, 2, 3, 4, 5, 6, 7, 8, 9]
(1, 2, 3, 4, 5, 6, 7, 8, 9)
45

Demetler Üzerinde Paketleme ve Paket Açma İşlemleri

Şimdi aşağıda göstereceğim kodlarda anlatmak istediğim bir demeti bir değişkene tanımlayabilir ve bu değişkeni daha sonra bir demete tanımlayarak açabiliriz. Bu olaya paketleme ve paket açma diyoruz.

sayılar = (1,2,3,4,5) #paketleme yaptık
(a,b,c,d,e) = sayılar #paketi açtık

for i in (a,b,c,d,e):
    print(i)

Çıktı:

1
2
3
4
5

Demetlerle ilgili son olarak liste veri yapıları ile demet veri yapılarını karşılaştırmak istiyorum.

  • Demetlerin elemanlarının değiştirilemeyeceğinden bahsetmiştim. Buradan demetlerin listelere göre bir tık daha hızlı çalıştığı sonucuna varabiliriz.
  • Değiştirilemez elemanlara sahip bir veri tipi olduğu için şifre programları gibi algoritmalarda rahatlıkla ve güvenle kullanılabilir.
  • 2 bölüm sonra bahsedeceğim sözlük veri yapılarında demetleri kullanabilirken listeler için aynı durumu söyleyemeyiz.