Python Dersleri #22: Demet Veri Tipi
Uzmoon · · 6 dk
Bu Dersin Amacı
Bu dersin amacı, Python programlama dilinde değiştirilemez (immutable) veri dizileri olan demetlerin (tuple) yapısını, nasıl tanımlandıklarını ve elemanlarına nasıl erişildiğini temel düzeyde kavramaktır.
Demet (Tuple) Veri Tipi Nedir?
Daha önceki derslerimizde birden fazla veriyi tek bir çatı altında sıralı olarak saklamamıza olanak tanıyan liste yapısını incelemiştik. Demetler (İngilizce adıyla tuple), listeler ile büyük benzerlik gösteren ancak tasarım amacı ve davranış biçimi bakımından kritik bir farka sahip olan koleksiyon veri tipleridir.
Demetlerin en temel niteliği değiştirilemez (immutable) olmalarıdır. Bir demet bellekte oluşturulduktan sonra elemanları güncellenemez, var olan elemanları silinemez veya bu demete yeni bir eleman eklenemez. Yazılım geliştirirken bazı verilerin program akışı süresince kesinlikle sabit kalmasını, kazara değiştirilmemesini veya dış etkilerden korunmasını isteriz. Örneğin haftanın günleri, coğrafi koordinatlar, bir pikselin renk değerleri (RGB) veya matematiksel sabitler gibi değerler demetler içinde saklanmaya son derece uygundur.
Demet Tanımlama ve tuple() Fonksiyonu
Python'da demetler genellikle yay ayraç () kullanılarak ve elemanların arasına virgül yerleştirilerek tanımlanır. Demetler; tam sayılar, ondalıklı sayılar, metinler (string) ve hatta mantıksal değerler gibi farklı veri tiplerini aynı anda bir arada barındırabilir.
Ayrıca hiçbir elemanı olmayan boş bir demet oluşturabilir ya da yerleşik tuple() fonksiyonunu kullanarak başka bir koleksiyonu (örneğin bir listeyi) demet haline dönüştürebilirsiniz. Bir demetin eleman sayısını öğrenmek için ise listelerden aşina olduğumuz len() fonksiyonu kullanılır.
# Bos bir demet tanimlama
bos_demet = ()
# Farkli veri tiplerini bir arada barindiran bir demet
kullanici_bilgisi = ("Ahmet", 28, "Turkiye", True)
# Bir listeyi tuple() fonksiyonu ile demete donusturme
programlama_dilleri_listesi = ["Python", "C++", "Java"]
programlama_dilleri_demeti = tuple(programlama_dilleri_listesi)
print("Kullanici Demeti:", kullanici_bilgisi)
print("Veri Tipi:", type(kullanici_bilgisi))
print("Eleman Sayisi:", len(kullanici_bilgisi))
print("Donusturulen Demet:", programlama_dilleri_demeti)
Yukarıdaki kodun çıktısı şu şekildedir:
Kullanici Demeti: ('Ahmet', 28, 'Turkiye', True)
Veri Tipi: <class 'tuple'>
Eleman Sayisi: 4
Donusturulen Demet: ('Python', 'C++', 'Java')
Tek Elemanlı Demet Tanımlama Kuralı
Python'da demet tanımlarken yeni başlayanların en sık karşılaştığı ve şaşırdığı durumlardan biri tek elemanlı demet oluşturmaktır. Matematiksel işlemlerde öncelik belirlemek için de yay ayraç () kullanıldığından, parantez içine tek bir değer yazdığınızda Python bunu bir demet olarak algılamaz; doğrudan o değerin kendi türü olarak işleme alır.
Python sözdiziminde bir yapının demet olduğunu belirleyen asıl işaret virgüldür. Bu nedenle tek bir elemandan oluşan bir demet tanımlamak istediğinizde, elemanın hemen ardından mutlaka bir virgül koymanız gerekir.
# Virgulsuz tanimlama (Demet OLMAZ, string veya int olarak algilanir)
yanlis_demet = ("Web Odasi")
print("yanlis_demet tipi:", type(yanlis_demet))
# Virgullu tanimlama (Dogru tek elemanli demet)
dogru_demet = ("Web Odasi",)
print("dogru_demet tipi:", type(dogru_demet))
# Parantezsiz tek elemanli demet tanimi
parantezsiz_demet = 100,
print("parantezsiz_demet tipi:", type(parantezsiz_demet))
Yukarıdaki kodun çıktısı şu şekildedir:
yanlis_demet tipi: <class 'str'>
dogru_demet tipi: <class 'tuple'>
parantezsiz_demet tipi: <class 'tuple'>
Demet Elemanlarına Erişim: İndeksleme ve Dilimleme
Demetler sıralı (ordered) veri yapılarıdır. Bu durum, demet içerisindeki her bir elemanın belirli bir konuma ve sıfırdan başlayan bir indeks numarasına sahip olduğu anlamına gelir. Tıpkı listelerde olduğu gibi köşeli ayraç [] kullanarak demet elemanlarına doğrudan erişebilirsiniz.
- Pozitif İndeksleme: Baştan sona doğru 0, 1, 2 şeklinde ilerler. İlk elemanın indeksi daima 0'dır.
- Negatif İndeksleme: Sondan başa doğru -1, -2, -3 şeklinde geriye doğru gider. Son elemanın indeksi daima -1'dir.
- Dilimleme (Slicing):
[baslangic:bitis:adim]kalıbı kullanılarak demetin belirli bir aralığından yeni bir alt demet elde edilir. Bitiş indeksindeki eleman dahil edilmez. - Üyelik Kontrolü: Bir değerin demet içerisinde yer alıp almadığını
inanahtar sözcüğü ile hızlıca sorgulayabilirsiniz.
meyveler = ("Elma", "Armut", "Muz", "Cilek", "Kivi")
# Ilk elemana erisim (0. indeks)
ilk_meyve = meyveler[0]
print("Ilk Meyve:", ilk_meyve)
# Son elemana negatif indeks ile erisim
son_meyve = meyveler[-1]
print("Son Meyve:", son_meyve)
# Dilimleme ile alt demet alma (1. indeksten 4. indekse kadar, 4 dahil degil)
orta_meyveler = meyveler[1:4]
print("Dilimlenmis Meyveler:", orta_meyveler)
# Eleman kontrolu
print("Muz demette var mi?:", "Muz" in meyveler)
print("Karpuz demette var mi?:", "Karpuz" in meyveler)
Yukarıdaki kodun çıktısı şu şekildedir:
Ilk Meyve: Elma
Son Meyve: Kivi
Dilimlenmis Meyveler: ('Armut', 'Muz', 'Cilek')
Muz demette var mi?: True
Karpuz demette var mi?: False
Demetlerin Değiştirilemezliği (Immutability)
Demetlerin en karakteristik özelliği, oluşturulduktan sonra hiçbir elemanının değiştirilememesidir. Bir listede belirli bir indeksteki elemana yeni bir değer atayabilirken, bunu bir demet üzerinde denediğinizde Python çalışma zamanında bir TypeError hatası fırlatır.
Bu özellik kodun güvenliği açısından büyük bir avantajdır. Örneğin karmaşık bir projede fonksiyonlar arasında paylaşılan bir veri yapısının başka bir kod bloğu tarafından yanlışlıkla bozulmayacağından emin olmak istediğinizde demetleri tercih edersiniz.
koordinatlar = (41.0082, 28.9784)
print("Mevcut Koordinatlar:", koordinatlar)
try:
# Demetin ilk elemanini degistirmeye calisalim
koordinatlar[0] = 40.9900
except TypeError as hata:
print("Hata meydana geldi!")
print("Hata Turu:", type(hata).__name__)
print("Hata Mesaji:", hata)
Yukarıdaki kodun çıktısı şu şekildedir:
Mevcut Koordinatlar: (41.0082, 28.9784)
Hata meydana geldi!
Hata Turu: TypeError
Hata Mesaji: 'tuple' object does not support item assignment
Demetler ile Listeler Arasındaki Temel Farklar
Her iki veri tipi de sıralı koleksiyonlar olmalarına rağmen farklı ihtiyaçlara yanıt vermek üzere tasarlanmıştır:
| Kriter | Demet (Tuple) | Liste (List) |
|---|---|---|
| Değiştirilebilirlik | Değiştirilemez (Immutable) | Değiştirilebilir (Mutable) |
| Sözdizimi | Yay ayraç () ve virgül |
Köşeli ayraç [] |
| Bellek Tüketimi | Daha az bellek kullanır | Daha fazla bellek tüketir |
| İşlem Hızı | Daha hızlı çalışır | Göreceli olarak daha yavaştır |
| Kullanım Amacı | Sabit ve korunması gereken veriler | Dinamik, ekleme ve çıkarma yapılan veriler |
Sık Yapılan Hatalar
- Tek elemanlı demette virgülü unutmak:
sayi = (5)yazıldığında bu değişken bir demet değil,inttüründe bir tam sayı olur. Doğru kullanımsayi = (5,)şeklindedir. - Eleman ataması yapmaya çalışmak: Demetlerin elemanlarını
demet[0] = yeni_degerşeklinde değiştirmeye çalışmakTypeErrorhatasına yol açar. Değerlerin değişmesi gerekiyorsa liste tercih edilmelidir. - Geçersiz indeks numarası kullanmak: Demette mevcut olmayan bir indekse erişmeye çalışmak (örneğin 3 elemanlı bir demette
demet[5]yazmak)IndexErrorhatası üretir. - Eleman silmeye çalışmak:
del demet[0]gibi ifadeler demetler üzerinde çalışmaz; demetin tek bir elemanı silinemez, ancakdel demetkomutuyla demet değişkeni bütünüyle bellekten kaldırılabilir.
Alıştırma
Bir sunucu bağlantı konfigürasyonunu saklamak amacıyla sunucu adresi (metin), bağlantı portu (tam sayı) ve SSL durumunu (mantıksal değer) içeren sunucu_ayari adında bir demet oluşturun. Ardından demetin eleman sayısını ekrana yazdırın, birinci elemanı olan sunucu adresini pozitif indeksle, son elemanı olan SSL durumunu ise negatif indeksle ekrana yazdırın.
Çözüm
sunucu_ayari = ("api.webodasi.com", 8080, True)
print("Yapilandirma Eleman Sayisi:", len(sunucu_ayari))
print("Sunucu Adresi:", sunucu_ayari[0])
print("SSL Etkin mi?:", sunucu_ayari[-1])
Yukarıdaki kodun çıktısı şu şekildedir:
Yapilandirma Eleman Sayisi: 3
Sunucu Adresi: api.webodasi.com
SSL Etkin mi?: True
Özet
Demetler (tuple), Python'da birden çok veriyi sıralı ve değiştirilemez biçimde saklamak için kullanılan temel koleksiyon veri tiplerindendir. Tanımlanırken yay ayraç kullanılır; tek elemanlı demetlerde virgül kullanımı zorunludur. Demetler listelere kıyasla daha az bellek harcar, daha hızlı çalışır ve verilerinizin istem dışı değiştirilmesini önleyerek programınızın veri güvenliğini artırır.