Kurs
Python listelerine benzer şekilde, demetler (tuples) bir dizi halinde değer saklamanıza izin veren bir başka standart veri tipidir. Verileri biriyle paylaşmak, ancak onların bu verileri değiştirmesine izin vermemek istediğiniz durumlarda faydalı olabilirler. Verileri kullanabilirler, ancak paylaşılan orijinal veride herhangi bir değişiklik yansımaz.
Bu eğitimde Python demetlerini ayrıntılı olarak göreceksiniz:
- demetleri nasıl başlatabileceğinizi öğreneceksiniz. Ayrıca örneklerle demetlerin değiştirilemez (immutable) doğasını göreceksiniz;
- Ayrıca bir demetin Python listesinden nasıl farklılaştığını keşfedeceksiniz;
- Ardından, dilimleme, çarpma, birleştirme vb. gibi çeşitli demet işlemlerini inceleyeceksiniz;
- demetlerle kullanılan yerleşik fonksiyonları bilmek faydalıdır ve bu bölümde bazı önemli olanlarını göreceksiniz.
- Son olarak, demetlere aynı anda birden çok değer atamanın da mümkün olduğunu göreceksiniz.

DataCamp'in Veri Bilimi için Veri Tipleri kursuna göz atmayı unutmayın; burada listeler, sözlükler, kümeler ve daha birçok veri yapısı hakkındaki bilginizi pekiştirip uygulayabilirsiniz! Alternatif olarak, Python'un kullandığı farklı veri yapıları hakkında daha fazla bilgi edinmek için bu Python Veri Yapıları Eğitimini de inceleyin.
Python Demeti (Tuple)
Yukarıda okuduğunuz gibi, bu Python veri yapısını, değiştirilemez (immutable) ve sıralı bir öğe dizisini saklamak için kullanabilirsiniz.
Demetler, listelerde olduğu gibi [] yerine () parantezleriyle başlatılır. Bu, bir demet oluşturmak için yalnızca aşağıdakini yapmanız gerektiği anlamına gelir:
cake = ('c','a','k','e')
print(type(cake))
<class 'tuple'>
Unutmayın ki type(), kendisine geçirilen parametrenin veri tipini kontrol etmenize olanak tanıyan yerleşik bir fonksiyondur.
Demetler hem homojen hem de heterojen değerleri tutabilir. Ancak, bu değerleri bir kez tanımladıktan sonra onları değiştiremeyeceğinizi unutmayın:
mixed_type = ('C',0,0,'K','I','E')
for i in mixed_type:
print(i,":",type(i))
C : <class 'str'>
0 : <class 'int'>
0 : <class 'int'>
K : <class 'str'>
I : <class 'str'>
E : <class 'str'>
# 0'ı 'O' ile değiştirmeyi deneyin
mixed_type[1] = 'O'
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-16-dec29c289a95> in <module>()
----> 1 mixed_type[1] = 'O' # Trying to change 0 to 'O'
TypeError: 'tuple' object does not support item assignment
Bu son hata iletisini alırsınız çünkü bir demetin içindeki değerleri değiştiremezsiniz.
Bir demet oluşturmanın bir başka yolu da şudur:
numbers_tuple = 1,2,3,4,5
print(type(numbers_tuple))
<class 'tuple'>Demetler ve Listeler
Dikkat etmiş olabileceğiniz gibi, demetler listelere oldukça benzer. Aslında, demetlerin değiştirilemez listeler olduğunu söyleyebilirsiniz; bu da bir demet oluşturulduktan sonra içindeki öğelerin değerlerini silemeyeceğiniz veya değiştiremeyeceğiniz anlamına gelir. Yeni değerler de ekleyemezsiniz. Şuna bakın:
numbers_tuple = (1,2,3,4,5)
numbers_list = [1,2,3,4,5]
# Demete bir sayı ekleyin
numbers_tuple.append(6)
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-26-e47776d745ce> in <module>()
3
4 # Append a number to the tuple
----> 5 numbers_tuple.append(6)
AttributeError: 'tuple' object has no attribute 'append'
Bu, bir demetten öğe silemeyeceğiniz veya demete ekleme yapamayacağınız, ancak bir listeyle bunu yapabileceğiniz için hata verir.
# Listeye sayılar ekleyin
numbers_list.append(6)
numbers_list.append(7)
numbers_list.append(8)
# Listeden bir sayı kaldırın
numbers_list.remove(7)
print(numbers_list)
[1, 2, 3, 4, 5, 6, 8]
Peki değiştirilemiyorlarsa neden demetleri kullanasınız?
Yalnızca verilere "salt okunur" erişim sağlamakla kalmazlar, aynı zamanda listelerden daha hızlıdırlar. Aşağıdaki kod parçalarını düşünün:
import timeit
timeit.timeit('x=(1,2,3,4,5,6,7,8,9)', number=100000)
0.0018976779974764213
timeit.timeit('x=[1,2,3,4,5,6,7,8,9]', number=100000)
0.019868606992531568
Değiştirilemezlik demetler açısından gerçekten ne anlama gelir?
Resmi Python belgelerine göre immutable, 'sabit değere sahip bir nesnedir', ancak 'değer' oldukça muğlak bir terimdir; demetler için doğru terim 'id' olacaktır. 'id', bir nesnenin bellekteki konumunun kimliğidir.
Biraz daha derine inelim:
# Öğelerinden biri liste olan 'n_tuple' demeti.
n_tuple = (1, 1, [3,4])
#Aynı değere sahip öğelerin id'si aynıdır.
id(n_tuple[0]) == id(n_tuple[1])
True
#Farklı değere sahip öğelerin id'si farklıdır.
id(n_tuple[0]) == id(n_tuple[2])
False
id(n_tuple[0])
4297148528
id(n_tuple[2])
4359711048
n_tuple.append(5)
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-40-3cd258e024ff> in <module>()
----> 1 n_tuple.append(5)
AttributeError: 'tuple' object has no attribute 'append'
Bir demete öğe ekleyemeyiz; bu nedenle yukarıda bir hata alırsınız. Bu yüzden demetler değiştirilemez olarak adlandırılır. Ancak, her zaman şunu yapabilirsiniz:
n_tuple[2].append(5)
n_tuple
(1, 1, [3, 4, 5])
Bu da, aslında orijinal demeti değiştirmenizi sağlar. Peki demet nasıl hâlâ değiştirilemez sayılıyor?
Bunun nedeni, demetin içindeki listenin id'si, siz ona 5 eklemiş olsanız bile aynı kalır.
id(n_tuple[2])
4359711048
Şimdiye kadar öğrendiklerinizi özetlemek gerekirse:
Bazı demetler (yalnızca değiştirilemez nesneler: stringler vb. içeriyorsa) değiştirilemezdir ve bazı demetler (bir veya daha fazla değiştirilebilir nesne: listeler vb. içeriyorsa) değiştirilebilir olabilir. Ancak bu, Python kullanıcıları arasında sıkça tartışılan bir konudur ve bunu tamamen anlamak için daha fazla arka plan bilgisine ihtiyaç duyarsınız. Aynı konuya ilişkin daha derinlemesine bir makale için buraya bakın. Şimdilik, genel olarak demetlerin değiştirilemez olduğunu söyleyelim.
- Değiştirilemez özellikleri nedeniyle bir demete öğe ekleyemezsiniz. Demetlerde
append()veyaextend()yöntemi yoktur, - Aynı nedenle bir demetten öğe kaldıramazsınız. Demetlerin
remove()veyapop()yöntemi yoktur, - Bir demette öğe arayabilirsiniz çünkü bu, demeti değiştirmez.
- Ayrıca bir öğenin demette olup olmadığını kontrol etmek için
inoperatörünü kullanabilirsiniz.
Bu nedenle, sabit bir değer kümesi tanımlıyor ve bununla yapacağınız tek şey üzerinde yineleme yapmaksa, liste yerine demet kullanın. Listelerle çalışmaktan daha hızlı ve ayrıca daha güvenlidir, çünkü demetler "yazma korumalı" veriler içerir.
Python listeleri hakkında daha fazla bilgi edinmek istiyorsanız, mutlaka bu eğitime göz atın!
Yaygın Demet İşlemleri
Python size demetleri işlemek için çeşitli yollar sunar. Önemli olanlardan bazılarına örneklerle bakalım.
Demet Dilimleme
Bir demetteki ilk değer 0 ile indekslenir. Python listelerinde olduğu gibi, demetteki öğelere erişmek için köşeli parantezleri [] indeks değerleriyle birlikte kullanabilirsiniz:
numbers = (0,1,2,3,4,5)
numbers[0]
0
Demetlerle negatif indekslemeyi de kullanabilirsiniz:
numbers[-1]
5
İndeksleme tekil öğeleri elde etmek için kullanılırken, dilimleme bir alt küme elde etmenizi sağlar. Çıkarmak istediğiniz bir aralık girdiğinizde buna aralık dilimleme denir. Aralık dilimlemenin genel formatı şöyledir:
[Start index (included):Stop index (excluded):Increment]
Burada Increment isteğe bağlı bir parametredir ve varsayılan artış 1'dir.
# 4 indeksindeki öğe hariçtir
numbers[1:4]
(1, 2, 3)
# Bu, demetteki tüm öğeleri verir
numbers[:]
(0, 1, 2, 3, 4, 5)
# Increment = 2
numbers[::2]
(0, 2, 4)
İpucu: Demeti tersine çevirmek için negatif artış değerini de kullanabilirsiniz.
numbers[::-1]
(5, 4, 3, 2, 1, 0)
Demet Toplama
Demetleri birleştirerek yeni bir demet oluşturabilirsiniz. Toplama işlemi demetlerde basitçe bir birleştirme (concatenation) yapar.
x = (1,2,3,4)
y = (5,6,7,8)
# İki demeti birleştirerek yeni bir demet oluşturma
z = x + y
print(z)
(1, 2, 3, 4, 5, 6, 7, 8)
y = [5,6,7,8]
z = x + y
print(z)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-55-d352c6414a4c> in <module>()
1 y = [5,6,7,8]
----> 2 z = x + y
3 print(z)
TypeError: can only concatenate tuple (not "list") to tuple
Yalnızca aynı veri tiplerini ekleyebilir veya birleştirebilirsiniz. Bu nedenle bir demet ile bir listeyi birleştirmek hata verir.
Demet Çarpma
Çarpma işlemi demetin tekrar edilmesine yol açar.
x = (1,2,3,4)
z = x*2
print(z)
(1, 2, 3, 4, 1, 2, 3, 4)
Demet Fonksiyonları
Python listelerinin aksine, demetlerde değiştirilemez doğaları nedeniyle append(), remove(), extend(), insert() ve pop() gibi yöntemler yoktur. Ancak, demetlerle çalışmak için birçok başka yerleşik yöntem vardır:
count() ve len()
count(), bir demetteki bir öğenin kaç kez geçtiğini döndürür.
a = [1,2,3,4,5,5]
a.count(5)
2
len() fonksiyonu ile demetin uzunluğunu döndürebilirsiniz:
a = (1,2,3,4,5)
print(len(a))
5
any()
any() fonksiyonunu, bir demetin herhangi bir öğesinin yinelenebilir (iterable) olup olmadığını keşfetmek için kullanabilirsiniz. Bu durumda True döner; aksi halde False döner.
a = (1,)
print(any(a))
True
Yukarıda a demetinin bildirimindeki , işaretine dikkat edin. Bir demette tek bir öğe başlatırken virgül belirtmezseniz, Python fazladan bir parantezi yanlışlıkla eklediğinizi varsayar (bu zararsızdır), ancak veri tipi demet olmaz. Bu nedenle, bir demette tek bir öğe bildirirken bir virgül eklemeyi unutmayın.
Şimdi tekrar any() fonksiyonuna dönelim: Boole bağlamında, bir öğenin değeri önemsizdir. Boş bir demet false, en az bir öğe içeren herhangi bir demet true kabul edilir.
b = ()
print(any(b))
False
Programınızın bir yerinde bir demeti çağırırken, demetin dolu olduğundan emin olmak istediğinizde bu fonksiyon faydalı olabilir.
tuple()
tuple() kullanarak bir veri tipini demete dönüştürün. Örneğin, aşağıdaki kod bloğunda bir Python listesini demete dönüştürürsünüz.
a_list = [1,2,3,4,5]
b_tuple = tuple(a_list)
print(type(b_tuple))
<class 'tuple'>
min() ve max()
max() demetteki en büyük öğeyi döndürürken, min() demetin en küçük öğesini döndürmek için kullanılabilir. Aşağıdaki örneği düşünün:
print(max(a))
print(min(a))
5
A
Bunu string veri tipi içeren demetlerle de kullanabilirsiniz.
# 'Apple' stringi otomatik olarak karakterlerin bir dizisine dönüştürülür.
a = ('Apple')
print(max(a))
p
sum()
Bu fonksiyonla, bir demetteki öğelerin toplamını döndürürsünüz. Yalnızca sayısal değerlerle kullanılabilir.
sum(a)
28
sorted()
Öğeleri sıralı bir düzende döndüren bir yapı elde etmek için sorted() kullanın; örneğin aşağıdaki gibi:
a = (6,7,4,2,1,5,3)
sorted(a)
[1, 2, 3, 4, 5, 6, 7]
Döndürülen tipin bir demet değil, bir liste olduğunu not etmek gerekir. Orijinal 'a' demetindeki sıralama değişmez ve 'a'nın veri tipi demet olarak kalır.
Bonus: Birden Çok Değer Atama
Demetlerle yapabileceğiniz hoş bir şey de, aynı anda birden çok değer atamak için onları kullanmaktır. Şuna bakın:
a = (1,2,3)
(one,two,three) = a
print(one)
1
a, üç öğeden oluşan bir demettir ve (one,two,three) üç değişkenden oluşan bir demettir. (one,two,three) ifadesini a demetine atamak, a'nın her bir değerini sırasıyla one, two ve three değişkenlerine atar. Bu, bir demette saklanan bir diziye bir dizi değeri atamanız gerektiğinde kullanışlı olabilir.
Tebrikler!
Bu demet eğitimini sonuna kadar tamamladınız! Bu süreçte Python demetlerinin ne olduğunu, onları nasıl başlatabileceğinizi, onları işlemek için yapabileceğiniz en yaygın işlemleri ve bu Python veri yapılarından daha fazla içgörü elde etmek için en yaygın yöntemlerin neler olduğunu öğrendiniz. Bonus olarak, demetlere aynı anda birden çok değer atayabileceğinizi de keşfettiniz.
