# Python Dersleri #22: Demet Veri Tipi

Kaynak: https://webodasi.com/python-dersleri-22-demet-veri-tipi/
Yazar: Uzmoon
Yayın: 2026-11-09
Güncelleme: 2026-11-09

> Bu derste Python programlama dilinde değiştirilemez veri yapıları olan demetlerin (tuple) mantığını, nasıl tanımlandıklarını, tek elemanlı demetlerde virgül kuralını, indeksleme ve dilimleme yöntemlerini ve listeler ile aralarındaki temel farkları öğrendik.

## 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ı `in` anahtar 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, `int` türünde bir tam sayı olur. Doğru kullanım `sayi = (5,)` şeklindedir.
- **Eleman ataması yapmaya çalışmak:** Demetlerin elemanlarını `demet[0] = yeni_deger` şeklinde değiştirmeye çalışmak `TypeError` hatası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) `IndexError` hatası üretir.
- **Eleman silmeye çalışmak:** `del demet[0]` gibi ifadeler demetler üzerinde çalışmaz; demetin tek bir elemanı silinemez, ancak `del demet` komutuyla 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.
