Python

Python’da Tuple ve Set Farkı

Python'da Tuple ve Set Farkı

Python programlama dilinde doğru veri yapısını seçmek, yazılımın performansı, güvenliği ve kodun okunabilirliği üzerinde doğrudan etkiye sahiptir. Geliştiricilerin sıklıkla karşılaştığı ve işlevsel olarak birbirinden oldukça farklı olan iki yerleşik koleksiyon türü tuple (demet) ve set (küme) yapılarıdır. Her iki yapı da birden fazla veriyi tek bir çatı altında toplama amacı taşısa da bellekteki davranışları, veri işleme kuralları ve algoritmik karmaşıklıkları tamamen ayrı prensiplere dayanır.

Tuple Veri Yapısı Nedir?

Tuple, sıralı (ordered) ve değiştirilemez (immutable) bir veri koleksiyonudur. Python içerisinde parantez sembolleri () kullanılarak tanımlanır. Bir tuple oluşturulduktan sonra bellekte sabit bir boyuta ve içeriğe sahip olur; yani mevcut bir tuple nesnesine yeni bir eleman eklenemez, var olan eleman silinemez veya güncellenemez.

Bu değiştirilemezlik özelliği, tuple nesnelerini veri bütünlüğünün korunması gereken durumlar için ideal kılar. Örneğin bir sistem konfigürasyonu, coğrafi koordinatlar veya veritabanından çekilen bir satırın alanları tuple ile güvence altına alınabilir. Tuple yapıları ayrıca indeksleme ve dilimleme (slicing) işlemlerini destekler.

sunucu_bilgisi = ("192.168.1.1", 8080, "TCP")

print(sunucu_bilgisi[0])
print(sunucu_bilgisi[1:])

Yukarıdaki örnekte üç farklı veri tipini barındıran bir tuple oluşturulmuştur. Sıfırıncı indeks kullanılarak ilk elemana erişilmiş ve ardından dilimleme işlemiyle birinci indeksten sonrasına ulaşılmıştır.

Eğer bu yapı içerisindeki bir elemanı değiştirmeye çalışırsanız, Python bir çalışma zamanı hatası fırlatır:

sunucu_bilgisi = ("192.168.1.1", 8080, "TCP")

sunucu_bilgisi[1] = 443

Bu kod çalıştırıldığında sistem TypeError: 'tuple' object does not support item assignment hatasını verir. Bu hata, tuple yapısının değiştirilemez olduğunu açıkça doğrular.

Set Veri Yapısı Nedir?

Set, matematikteki küme teorisine dayanan, sırasız (unordered) ve yalnızca benzersiz (unique) elemanlar barındıran bir veri koleksiyonudur. Python içerisinde süslü parantez {} veya set() kurucu fonksiyonu ile tanımlanır. Set yapısı değiştirilebilir (mutable) bir koleksiyondur; yani çalışma zamanında eleman eklenebilir veya silinebilir.

Set yapısının en kritik özelliği yinelenen (duplicate) verilere izin vermemesidir. Bir sete aynı değerden birden fazla kez eklense bile, küme bu elemandan yalnızca tek bir adet saklar. Ayrıca, set yapıları elemanların sırasını garanti etmediği için indeks numaraları üzerinden elemanlara doğrudan erişim sağlanamaz.

zararli_ipler = {"10.0.0.1", "10.0.0.2", "10.0.0.1", "172.16.0.5"}

print(zararli_ipler)
zararli_ipler.add("192.168.0.100")
print(zararli_ipler)

Bu örnekte "10.0.0.1" adresi iki kez tanımlanmasına rağmen çıktı alındığında kümede yalnızca bir kez yer aldığı görülür. add() metodu ile kümeye yeni bir IP adresi dahil edilmiştir.

İndeks üzerinden erişim denendiğinde ise hata ile karşılaşılır:

zararli_ipler = {"10.0.0.1", "10.0.0.2"}

print(zararli_ipler[0])

Bu kod parçası TypeError: 'set' object is not subscriptable hatası üretir, çünkü kümelerin sabit bir sıralama mekanizması ve dolayısıyla indeks numarası yoktur.

Tuple ve Set Arasındaki Temel Farklar

Bu iki yapıyı birbiriyle kıyaslarken geliştirme mimarisini etkileyen başlıca kriterler göz önüne alınmalıdır.

Sıralama ve İndeksleme

  • Tuple sıralı bir koleksiyondur; elemanların eklenme sırası korunur ve her elemana belirli bir indeks numarasıyla erişilebilir.
  • Set sırasızdır; elemanların bellekteki yeri sabit bir dizi yapısına değil, arka plandaki hash tablosuna bağlıdır, bu nedenle indeksleme veya dilimleme yapılamaz.

Değiştirilebilirlik (Mutability)

  • Tuple değiştirilemez (immutable) bir yapıya sahiptir. Tanımlandıktan sonra eleman eklenemez, çıkarılamaz veya değeri güncellenemez.
  • Set değiştirilebilir (mutable) bir yapıdadır; add(), remove() veya discard() gibi fonksiyonlarla çalışma zamanında dinamik olarak güncellenebilir.

Yinelenen Elemanlar (Duplication)

  • Tuple aynı değere sahip birden fazla elemanı barındırabilir. Örneğin (1, 2, 2, 3) geçerli bir tuple nesnesidir.
  • Set yinelenen elemanları otomatik olarak temizler. Koleksiyondaki her eleman mutlaka benzersiz olmalıdır.

Bellek Tüketimi ve Arama Performansı

  • Tuple, sabit boyutlu yapısı nedeniyle Python tarafından bellekte daha az yer kaplayacak şekilde optimize edilir. Ancak bir elemanın varlığını kontrol etmek (in işleci) baştan sona lineer arama gerektirdiğinden ortalama O(n) zaman karmaşıklığına sahiptir.
  • Set, hash tablosu (hash table) mimarisini kullandığı için bellekte daha fazla yer kaplar. Buna karşılık, bir elemanın kümede olup olmadığını sorgulama işlemi ortalama O(1) zaman karmaşıklığı ile sabit sürede gerçekleşir.
import sys

ornek_tuple = (1, 2, 3, 4, 5)
ornek_set = {1, 2, 3, 4, 5}

print("Tuple boyutu:", sys.getsizeof(ornek_tuple), "bayt")
print("Set boyutu:", sys.getsizeof(ornek_set), "bayt")

Bu kontrol çalıştırıldığında aynı verileri içermelerine rağmen set yapısının hash mekanizmasını desteklemek amacıyla daha yüksek bellek ayırdığı net bir şekilde gözlemlenir.

Hangi Senaryoda Hangisi Seçilmelidir?

Veri yapısı tercihi yapılacak işlemin gereksinimlerine göre şekillenmelidir:

  • Veri bütünlüğü ve sabitlik gerekiyorsa tuple tercih edilmelidir. Fonksiyondan birden fazla değer dönerken, sözlük (dict) yapılarında anahtar (key) olarak sabit veri grupları kullanılırken tuple yapısı standarttır.
  • Bir listedeki tekrar eden elemanları tek hamlede temizlemek gerekiyorsa set kullanılmalıdır.
  • Büyük hacimli veri yığınları içerisinde üyelik testi yapılacaksa set kullanılmalıdır. Örneğin, binlerce zararlı IP adresinin bulunduğu bir listede gelen bir ağ isteğinin adresini kontrol etmek set ile milisaniyeler mertebesinde gerçekleşir.
  • Matematiksel küme operasyonları (kesişim, birleşim, fark) uygulanacaksa doğrudan set fonksiyonlarından yararlanılmalıdır.
guvenli_portlar = {80, 443, 8080}
aktif_portlar = {22, 80, 443, 3389}

kesisim = guvenli_portlar.intersection(aktif_portlar)
fark = aktif_portlar.difference(guvenli_portlar)

print("Ortak portlar:", kesisim)
print("Guvenli olmayan aktif portlar:", fark)

Özet ve Sonraki Adımlar

Python’da tuple yapısı verilerin sabitliğini, sıralı olmasını ve düşük bellek tüketimini garanti ederken; set yapısı benzersizliği, yüksek hızlı üyelik denetimlerini ve küme işlemlerini ön plana çıkarır. Değiştirilemeyen bir küme yapısına ihtiyaç duyduğunuz senaryolarda ise Python’ın yerleşik frozenset yapısını araştırarak koleksiyonlar konusundaki bilginizi bir adım ileriye taşıyabilirsiniz.

#python#set#tuple#veri yapıları#yazılım

Comments

No comments yet. Be the first to comment.

Leave a comment

Comments are published after the admin approves them.