Python 3'te Tuple'ları Anlamak
Giriş
Bir demet (tuple), değiştirilemez (immutable), sıralı bir elemanlar dizisidir. Demetler değiştirilemez olduğu için, içerdikleri değerler değiştirilemez. Aşağıda dört elemandan oluşan bir demet örneği verilmiştir:
Örnek Tuple
mercan = ('mavi mercan', 'geyik boynuzu mercanı', 'sütun mercanı', 'geyiğin boynuzu mercanı')
Demetler, verileri gruplamak için kullanılır. Bir demetin içindeki her bir eleman veya değere öğe (item) denir.
Demetler, parantezler (
)
içinde, virgüller ,
ile ayrılmış değerler içerir. Boş demetler mercan = ()
şeklinde görünür, ancak tek bir değeri olan demetlerde bile bir virgül kullanmak zorundadır: mercan = ('mavi mercan',)
.
Eğer yukarıdaki demeti print()
fonksiyonu ile yazdırırsak, aşağıdaki çıktıyı alırız. Demet hâlâ parantezler içinde yazılıdır:
print(mercan)
Çıktı
('mavi mercan', 'geyik boynuzu mercanı', 'sütun mercanı', 'geyiğin boynuzu mercanı')
Python demetlerini ve diğer veri yapısı türlerini düşünürken, bilgisayarınızdaki dosya koleksiyonları, şarkı çalma listeleri, tarayıcı yer imleri, e-postalar ve akış hizmetlerindeki video koleksiyonları gibi farklı koleksiyonları düşünmek faydalı olabilir.
Demetler listelere benzer, ancak değerleri değiştirilemez. Bu nedenle, kodunuzda demetleri kullandığınızda, başkalarına bu değer dizisinin değiştirilmeyeceğini belirtmiş olursunuz. Ayrıca, değerler değişmediği için, Python'da demetlerin kullanılması ile kodunuz biraz daha hızlı çalışabilir, çünkü demetler listelere göre daha hızlıdır.
Demetlerde İndeksleme
Sıralı bir elemanlar dizisi olarak, demet içindeki her öğe, indeksleme (indexing) ile ayrı ayrı çağrılabilir.
Her öğe, 0
'dan başlayan bir tam sayı olan bir indeks numarasına karşılık gelir.
Bilgi: Bu eğitimdeki örnek kodları takip etmek için yerel sisteminizde bir Python interaktif kabuğu açmak üzere python3
komutunu çalıştırın. Daha sonra örnekleri kopyalayıp yapıştırabilir veya >>>
istemine ekleyerek düzenleyebilirsiniz.
Bu eğitimin başındaki mercan
demet örneği için indeks dağılımı şu şekildedir:
‘mavi mercan’ ‘geyik boynuzu mercanı’ ‘sütun mercanı’ ‘geyiğin boynuzu mercanı’
0 1 2 3
İlk öğe, yani 'mavi mercan' dizesi 0
. indekste başlar ve liste, 3
indeksle, 'geyiğin boynuzu mercanı' öğesi ile sona erer.
Her öğenin bir Python demetinde bir indeks numarası olduğu için, öğelere erişebiliriz.
Artık demetin belirli bir öğesini indeks numarasına başvurarak çağırabiliriz:
print(mercan[2])
Çıktı
sütun mercanı
Bu demet için indeks numaraları 0
-3
arasında değişir. Bu yüzden her bir öğeyi ayrı ayrı çağırmak için indeks numaralarına şu şekilde başvurabiliriz:
mercan[0] = 'mavi mercan'
mercan[1] = 'geyik boynuzu mercanı'
mercan[2] = 'sütun mercanı'
mercan[3] = 'geyiğin boynuzu mercanı'
Eğer indeks numarası 3
'ten büyük bir değere sahip bir öğeyi çağırırsak, bu geçerli olmaz ve dizinin dışında bir hata oluşur:
print(mercan[22])
Çıktı
IndexError: tuple index out of range
Pozitif indeks numaralarına ek olarak, negatif indeks numaraları ile demet içindeki öğelere sondan geriye doğru sayarak da erişebiliriz, -1
'den başlayarak. Bu, uzun bir demetimiz varsa ve demetin sonuna doğru bir öğeyi belirlemek istediğimizde özellikle faydalıdır.
Aynı mercan
demeti için negatif indeks dağılımı şu şekildedir:
‘mavi mercan’ ‘geyik boynuzu mercanı’ ‘sütun mercanı’ ‘geyiğin boynuzu mercanı’
-4 -3 -2 -1
Bu durumda, negatif indeks numarası ile 'mavi mercan' öğesini yazdırmak istiyorsak, şu şekilde yapabiliriz:
print(mercan[-4])
Çıktı
mavi mercan
Bir demetteki dize öğelerini, +
operatörü ile diğer dizelerle birleştirebiliriz:
print('Bu resif ' + mercan[1] + ' ile oluşmuştur')
Çıktı
Bu resif geyik boynuzu mercanı ile oluşmuştur
0
indeks numarasındaki dizeyi 'Bu resif ' dizesi ile birleştirebildik. Ayrıca +
operatörünü kullanarak iki veya daha fazla demeti birleştirebiliriz.
İndeks numaralarıyla bir demetteki öğelere erişebilmek, her bir öğeyi ayrı ayrı çağırabilmemizi sağlar.
Demetleri Dilimleme
İndeksleme kullanarak demetlerden birkaç öğeyi çağırabiliriz. Dilimler (slices), birden fazla öğeyi aralarına iki nokta üst üste [x:y]
koyarak bir indeks aralığı oluşturarak çağırmamızı sağlar.
Örneğin, mercan
demetinin ortasındaki öğeleri yazdırmak istersek, bir dilim oluşturabiliriz.
print(mercan[1:3])
Çıktı
('geyik boynuzu mercanı', 'sütun mercanı')
Dilim oluştururken [1:3]
gibi bir yapıda, ilk indeks numarası dilimin başladığı yeri (dahil), ikinci indeks numarası ise dilimin bittiği yeri (hariç) belirtir. Yukarıdaki örnekte, 1
ve 2
numaralı pozisyondaki öğeler yazdırılmıştır.
Liste başındaki öğeleri dahil etmek için, demet [x:y]
söz diziminde bir numarayı atlayabiliriz. Örneğin, mercan
demetinin ilk 3 öğesini yazdırmak istersek: — ki bu 'mavi mercan'
, 'boynuzlu mercan'
, 'sütun mercanı'
olurdu — bunu yazarak yapabiliriz:
print(mercan[:3])
Çıktı
('mavi mercan', 'geyik boynuzu mercanı', 'sütun mercanı')
Bu, demetin başını yazdırır ve 3
indeksin hemen öncesinde durur.
Demetin sonundaki tüm öğeleri dahil etmek için ise söz dizimini ters çevirebiliriz:
print(mercan[1:])
Çıktı
('geyik boynuzu mercanı', 'sütun mercanı', 'geyiğin boynuzu mercanı')
Negatif indeks numaraları da demetlerde dilimleme yaparken pozitif indeks numaraları gibi kullanılabilir:
print(mercan[-3:-1])
print(mercan[-2:])
Çıktı
('geyik boynuzu mercanı', 'sütun mercanı')
('sütun mercanı', 'geyiğin boynuzu mercanı')
Dilimlemede kullanabileceğimiz son parametre ise adımsızlık (stride) olarak adlandırılır. Bu, demetten ilk öğe alındıktan sonra kaç öğe ilerleyeceğimizi belirtir.
Şu ana kadar, adım parametresini atladık ve Python, adımı varsayılan olarak 1 olarak kabul etti, bu yüzden iki indeks numarası arasındaki her öğe getirildi.
Bu yapının söz dizimi demet[x:y:z]
olup, z
adım değerini belirtir. Daha büyük bir liste oluşturalım, ardından dilimleyelim ve adım değerini 2 yapalım:
sayılar = (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)
print(sayılar[1:11:2])
Çıktı
(1, 3, 5, 7, 9)
numbers[1:11:2]
yapısı, 1
ile 11
indeks numaraları arasındaki değerleri (11 hariç) yazdırır, ardından adım değeri olan 2
, programın her ikinci öğeyi yazdırmasını sağlar.
İlk iki parametreyi atlayıp, tuple[::z]
sözdizimini kullanarak yalnızca stride'ı parametre olarak kullanabiliriz:
print(sayılar[::3])
Çıktı
(0, 3, 6, 9, 12)
numbers
demetini adımı 3
olacak şekilde yazdırdığımızda, yalnızca her üçüncü öğe yazdırılır:
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12
Pozitif ve negatif indeks numaralarıyla dilimleme yaparak ve adımı belirterek, istediğimiz çıktıyı elde etmek için gerekli kontrole sahip oluruz.
Demetleri Birleştirme ve Çarpma
Operatörler, demetleri birleştirmek veya çarpmak için kullanılabilir. Birleştirme +
operatörüyle, çarpma ise *
operatörüyle yapılır.
+
operatörü, iki veya daha fazla demeti birleştirmek için kullanılabilir. Mevcut iki demetin değerlerini yeni bir demete atayabiliriz:
mercan = ('mavi mercan', 'geyik boynuzu mercanı', 'sütun mercanı', 'geyiğin boynuzu mercanı')
yosun = ('wakame', 'alaria', 'derin deniz yosunu', 'macrocystis')
mercan_yosun = (mercan + yosun)
print(mercan_yosun)
Çıktı
('mavi mercan', 'geyik boynuzu mercanı', 'sütun mercanı', 'geyiğin boynuzu mercanı', 'wakame', 'alaria', 'derin deniz yosunu', 'macrocystis')
+
operatörü demetleri birleştirebildiği için, demetleri birleştirip yeni bir demet oluşturmak için kullanılabilir, ancak mevcut bir demeti değiştiremez.
*
operatörü, demetleri çoğaltmak için kullanılabilir. Örneğin, bir dizindeki tüm dosyaları bir sunucuya kopyalamak veya bir çalma listesini arkadaşlarla paylaşmak istiyorsanız, veri koleksiyonlarını çoğaltmanız gerekebilir.
mercan
demetini 2 ile, yosun
demetini ise 3 ile çarpalım ve bunları yeni demetlere atayalım:
çoğaltılmış_mercan = mercan * 2
çoğaltılmış_yosun = yosun * 3
print(çoğaltılmış_mercan)
print(çoğaltılmış_yosun)
Çıktı
('mavi mercan', 'geyik boynuzu mercanı', 'sütun mercanı', 'geyiğin boynuzu mercanı', 'mavi mercan', 'geyik boynuzu mercanı', 'sütun mercanı', 'geyiğin boynuzu mercanı')
('wakame', 'alaria', 'derin deniz yosunu', 'macrocystis', 'wakame', 'alaria', 'derin deniz yosunu', 'macrocystis', 'wakame', 'alaria', 'derin deniz yosunu', 'macrocystis')
*
operatörü sayesinde, demetlerimizi belirttiğimiz sayıda çoğaltabiliriz ve orijinal veri dizisine dayalı yeni demetler oluşturabiliriz.
Mevcut demetler, +
ve *
operatörleri kullanılarak yeni demetler oluşturacak şekilde birleştirilebilir veya çoğaltılabilir.
Tuple Fonksiyonları
Tuple'larla çalışmak için kullanabileceğiniz birkaç yerleşik fonksiyon vardır. Bunlardan bazılarına göz atalım.
len()
String ve listelerde olduğu gibi, bir tuple'ın uzunluğunu len()
fonksiyonu ile hesaplayabiliriz. Bu fonksiyona parametre olarak tuple'ı geçiririz, örneğin:
len(coral)
Bu fonksiyon, minimum veya maksimum koleksiyon uzunluklarını uygulamak gerektiğinde ya da sıralı verileri karşılaştırmak için kullanışlıdır.
kelp
ve numbers
tuple'larının uzunluğunu yazdırırsak, şu çıktıyı alırız:
print(len(kelp))
print(len(numbers))
Çıktı
4
13
Bu çıktıyı alıyoruz çünkü kelp
tuple'ında 4 öğe bulunuyor:
kelp = ('wakame', 'alaria', 'derin deniz karmaşası', 'macrocystis')
Ve numbers
tuple'ında 13 öğe bulunuyor:
numbers = (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)
Bu örneklerde nispeten az öğe olmasına rağmen, len()
fonksiyonu, büyük tuple'lardaki öğe sayısını görmemizi sağlar.
max() ve min()
Sayısal öğelerden (tamsayılar ve ondalıklı sayılar dahil) oluşan tuple'larla çalışırken, tuple içindeki en yüksek ve en düşük değerleri bulmak için max()
ve min()
fonksiyonlarını kullanabiliriz.
Bu fonksiyonlar, test sonuçları, sıcaklıklar, fiyatlar gibi nicel veriler hakkında bilgi edinmemizi sağlar.
Bir ondalıklı sayılardan oluşan tuple'a bakalım:
daha_fazla_sayılar = (11.13, 34.87, 95.59, 82.49, 42.73, 11.12, 95.57)
max()
değerini almak için tuple'ı fonksiyona geçiririz, örneğin max(more_numbers)
. Sonuçları yazdırabilmek için bunu print()
fonksiyonu ile birleştirelim:
print(maksimum(daha_fazla_sayı))
Çıktı
95.59
max()
fonksiyonu, tuple içindeki en yüksek değeri döndürdü.
Benzer şekilde min()
fonksiyonunu kullanabiliriz:
print(min(daha_fazla_sayı))
Çıktı
11.12
Burada tuple içindeki en küçük ondalıklı sayı bulundu ve yazdırıldı.
Tıpkı len()
fonksiyonunda olduğu gibi, max()
ve min()
fonksiyonları da çok sayıda değere sahip tuple'larla çalışırken oldukça kullanışlıdır.
Tuple'ların Listelerden Farkı
Tuple'ların listelerden farklı olmasının temel nedeni, tuple'ların değiştirilememesidir. Bu, tuple'lara öğe eklenemeyeceği, silinemeyeceği ve öğelerin değiştirilemeyeceği anlamına gelir.
Ancak, 2 veya daha fazla tuple'ı birleştirerek yeni bir tuple oluşturabilirsiniz.
coral
tuple'ını ele alalım:
mercan = ('mavi mercan', 'geyik boynuzu mercanı', 'sütun mercanı', 'geyik boynuzu mercanı')
Diyelim ki 'blue coral'
öğesini 'black coral'
ile değiştirmek istiyoruz. Bir liste ile yaptığımız gibi:
mercan[0] = 'siyah mercan'
Yazarsak şu hatayı alırız:
TypeError: 'tuple' nesnesi öğe atamasını desteklemiyor
Bu, tuple'ların değiştirilememesinden kaynaklanır.
Bir tuple oluşturup daha sonra listeye ihtiyacımız olduğunu fark edersek, bunu bir listeye dönüştürebiliriz. Bir tuple'ı listeye dönüştürmek için list()
fonksiyonunu kullanabiliriz:
liste(mercan)
Artık coral
veri tipimiz bir liste olacaktır:
mercan = ['mavi mercan', 'boynuzlu mercan', 'sütun mercan']
Parantezlerin köşeli paranteze dönüştüğünü görebiliriz, bu da tuple'ın listeye dönüştüğünü gösterir.
Aynı şekilde listeleri tuple'a dönüştürmek için tuple()
fonksiyonunu kullanabiliriz.
Veri tiplerini dönüştürme hakkında daha fazla bilgi edinmek için "Python 3'te Veri Tipleri Nasıl Dönüştürülür" başlıklı makaleyi okuyabilirsiniz.
Sonuç
Tuple veri tipi, sıralı bir veri tipidir ve değiştirilemez. Bu, Python'un tuple'ları işleme süresini biraz daha hızlı hale getirerek programlarınızda optimizasyon sunar. Kodunuz üzerinde diğerleriyle iş birliği yaptığınızda, tuple kullanmanız, o değerler dizisinin değiştirilmesinin amaçlanmadığını diğer kişilere iletecektir.
Bu kılavuz, tuple'ların temel özelliklerini, indeksleme, dilimleme ve birleştirme işlemlerini ve mevcut yerleşik fonksiyonları ele aldı.
Lisa Tagliaferri tarafından yazılan Understanding Tuples in Python 3 a Programming makalesinin düzenlenmiş çevirisi
Daha Fazla Oku:
- Sonraki Makale: Python 3'te Sözlükleri Anlamak
- Önceki Makale: Python 3'te Liste Kavramlarını Anlamak