Ders 20
3.2.3 - Topluluk (Tuple) Tipi Verilere Uygulanabilen Metotlar
Topluluk tipi değerler, bir kez atandıktan sonra kısmen değiştirilemez (immutable) nitelikte değerlerdir. Bu nitelikte değerlere, liste tipi atandıktan sonra kısmen değişebilir (mutable) nitelikte değerlere uygulanabilen, append() gibi kısmi değişim metotları uygulanamaz. Bu nedenle, topluluk ve frozenset tipindeki verilere uygulanabilen çok az sayıda, öntanımlı metot ve fonksiyon bulunmaktadır.
İki koleksiyon tipi verinin birbirine denk gelen elemanlarını tek bir koleksiyonun elemanları olarak birleştiren zip() fonksiyonu, uygulamalarda çok kullanışlı olan bir fonksiyondur. Bu fonksiyonun geri döndürdüğü koleksiyonun veri tipi ve geri döndürdüğü veri yığının elemanlarına erişim, aşağıdaki örneklerde görülebilir.
x = (25, 56, 88)
y = (16, 44, 88)
print(type(zip(x,y)))
Program Sonucu :
<class 'zip'>
x = (25, 56, 88)
y = (16, 44, 88)
print (zip(x,y)[0])
Program Sonucu :
TypeError Traceback (most recent call last)
<ipython-input-3-04728e4c5907> in <module>()
3 y = (16, 44, 88)
4
----> 5 print (zip(x,y)[0])
TypeError: 'zip' object is not subscriptable
x = (25, 56, 88)
y = (16, 44, 88)
for i in zip(x,y):
print (i, type(i))
Program Sonucu :
(25, 16) <class 'tuple'>
(56, 44) <class 'tuple'>
(88, 88) <class 'tuple'>
Yukarıdaki örneklerden görüldüğü gibi, öntanımlı zip() fonksiyonu, her tipten koleksiyon verilerini birleştirerek, bir iterasyon yapılabilecek veri agregatı (yığın) oluşturmaktadır. Python programlama dilinde, iterasyon yapılabilecek veri yığınlarına iteratör denilir ve her iteratörün mutlaka bir veri tipi olması gerekmez. Öntanımlı zip() fonksiyonu tarafından geri döndürülen veri yığını, tanımlı hiçbir veri tipinde değil, özel zip tipinde bir veri yığınıdır.
İkinci programdan, özel zip tipi verilerin, indislenemediğini görüyoruz. Bu durumda bu verilerin elemanlarına while döngüleri ile sıralı erişim sağlanmasının olanağı bulunmamaktadır. Bu elemanların indis değerleri tanımlı olmadığından, tek tek elemanlarına erişim olası değildir.
Sonuncu programda, zip tipi verileri bir iteratör olduğu ve elemanlarının, her iki orijinal iteratörün denk gelen elemanları ile oluşmuş, iki elemanlı topluluklar olduğu, ve bu zip topluluklarının elemanlarına, for in döngülerinden yararlanılarak sıralı erişim sağlanabileceği anlaşılmaktadır.
Zip topluluklarının iç elemantlarına, iki döngü değişkenli for in döngülerinden yararlanılarak erişim sağlanabilir. Örnek,
x = (25, 56, 88)
y = (16, 44, 88)
for i,j in zip(x,y):
print (i, j)
Program Sonucu :
25 16
56 44
88 88
Veya, daha sistematik olarak,
x = (25, 56, 88)
y = (16, 44, 88)
for i in zip(x,y):
for j in i:
print (j, '\t', end = '')
Program Sonucu :
25 16 56 44 88 88
Zip verilerinin indislenemez olması, bir dezavantaj gibi görülürse bu fonksiyonu enumerate () fonksiyonu ile akuple ederek, indis görüntülü bir veri agregatı oluşturma olanağı bulunmaktadır. Bu tip bir veri yığının yapısı, aşağıdaki fonksiyonda görülmektedir.
x = (25, 56, 88)
y = (16, 44, 88)
for i in enumerate(zip(x, y)):
print(i)
Program Sonucu :
(0, (25, 16))
(1, (56, 44))
(2, (88, 88))
Bu sonuçtan, oluşan iteratörün artık iki boyutlu olduğu, her elemanın bir dış topluktan oluştuğu, bu dış topluluğun ilk elemanının, enumerate () fonksiyonunun geri döndürdüğü sanal indis sayısı olduğu, ikinci elemanın bir iç topluluk olduğu ve bu iç topluluğun elemanlarının ziplenmiş orijinal iteratörlerin birbirlerine denk konumdaki elemanlarından oluştuğu görülmektedir. Bu veri yapısında, erişim sağlanan değerin konumunun görülmesi için, aşağıdaki programdan yararlanılabilir.
for i, j in enumerate(zip(x, y)):
m = 0
for k in j:
while not m > (len(j)-1):
print('[{0},{1},{2}] = {3}'.format(i, 1 , m, j[m]))
m = m + 1
Program Sonucu :
[0,1,0] = 25
[0,1,1] = 16
[1,1,0] = 56
[1,1,1] = 44
[2,1,0] = 88
[2,1,1] = 88
Tüm bu görüntülenen indis değerlerinin ve değerlerin sanal olduğu, bu sanal indis değerleri ile , ziplenmiş sanal değerlere erişim olanağı olmadığı iyi özümsenmelidir. Ziplenmiş değerlere sadece for in döngüleri ile sıralı erişim sağlanabilir.
Topluluklar üzerine, count() metodu uygulanabilir. Bu metot bir topluluk ve x de bu topluluğun bir elemanı olmak üzere, t.count(x) şeklinde uygulanarak, bu elemanın toplulukta bulunan sayısını döndürür. Örnek:
t = (22,33,44,55, 55, 55)
print(t.count(55))3
Program Sonucu :
Topluluklar üzerine, index() metodu uygulanabilir. Bu metott bir topluluk ve x de bu topluluğun bir elemanı olmak üzere, t.index(x) şeklinde uygulanarak, bu elemanın toplulukta soldan başlayarak, ilk rastlandığı konumun indisini döndürür. Örnek:
t = (22,33,44,55, 55, 55)
print(t.index(55))
Program Sonucu :
3
Topluluklara uygulanan len(t) fonksiyonu, topluluktaki eleman sayısını döndürür.Bu konuda, daha önce örnekler verilmiştir.
Bir t iteratörü içinde içindeki tüm veriler 0 veya False ise all(t ), fonksiyonu geriye True, yoksa False döndürür. Bunu anyone is true? ve all of them is true? olarak düşününüz. Aşağıdaki tabloya bakınız,
Any | All | |
---|---|---|
All Truthy values | True | |
All Falsy Values | False | False |
At Least One Truthy | True | False |
At Least One Falsy | False | False |
t =(8 , 9, 6, 7)
print(all(t))
Program Sonucu :
True
Bu sonucu yukarıdaki doğruluk tablosu ile karşılaştıralım. Tüm1 ve daha büyük tamsayı değerleri "Doğru (True)" anlamındadır. İncelenen t topluluk verisinde, tüm elemanlar "Doğru (True)" değerindedir. Bu nedenle all(t) sonucu doğru olarak gerçekleşmiştir.
t1 = (0 ,5 ,6 ,7)
print(all(t1))
Program Sonucu :
False
Burada ise, t1 topluluğunda, elemanlardan birisi 0 değerindedir. Sıfır değeri Yanlış (False) anlamınadır. Bu nedenle tüm koleksiyon elemanlarının doğru olup olmadığını sorgulayan a(t1) sorgusunun yanıtı, yanlış olarak gerçekleşmiştir.
t =(8 , 9, 6, 7)
print(any(t))
Program Sonucu :
True
Tüm koleksiyon elemanları içinde doğru bir eleman olup olmadığını sorgulayan any(t) sorgusunun yanıtı incelenen t koleksiyonunun elemanlarının hepsi doğru olduğu için, doğru olarak gerçekleşmiştir. Tüm elemanlar içinde sadece bir tane doğru diğerlerinin tümü yanlış da olsa, yanıt yine doğru olacaktı.
Bir koleksiyona uygulanan min() fonksiyonu, en küçük, max() fonksiyonu ise en büyük, değeri geri döndürür. sum() elementlerin toplamını verir. Yalnız, bu fonksiyonlar sadece homojen, tek boyutlu koleksiyonlar ile sonuç verebilir. Örnek,
print(max(3,4,9))
Program Sonucu :
9
w = (6,7,(8,9))
print(max(w))
Program Sonucu :
TypeError Traceback (most recent call last)
<ipython-input-3-7920a90a6dfd> in <module>()
1 w = (6,7,(8,9))
----> 2 print(max(w))
TypeError: unorderable types: tuple() > int()
Topluluklar değişmez veriler oldukklarından, bir kez atandıktan sonrai listeler gibi sort() metodu ile sıralanamazlar. Fakat atanmış bir topluluk, topluluklara uygulanabilen sorted() metodunun uygulanması ile, sıralanmış olarak başka bir değişkene değer olarak aktarılabilirler. Öntanımlı sorted() metodunun reverse ve key parameterleri vardır. Sıralama yöntemi üzerine bir yöntem , bir fonksiyonda tanımlanırsa, key parametresi ile bu fonksiyonun adı verilebilir. Reverse = True olunca büyükten küçüğe doğru sıralama yapılır. Örnek:
Ödeme_listesi = (('Sevgi Hasol', 8, 345), ('Ahmet Kahraman', 12, 430), ('Celal Azal', 18, 255) )
print(Ödeme_listesi)
Program Sonucu :
(('Sevgi Hasol', 8, 345), ('Ahmet Kahraman', 12, 430), ('Celal Azal', 18, 255))
Ödeme_listesi_isim = sorted(Ödeme_listesi)
print(Ödeme_listesi_isim)
Program Sonucu :
[('Sevgi Hasol', 8, 345), ('Celal Azal', 18, 255), ('Ahmet Kahraman', 12, 430)]
Ödeme_listesi_isim = sorted(Ödeme_listesi , reverse=True)
print(Ödeme_listesi_isim)
Program Sonucu :
[('Sevgi Hasol', 8, 345), ('Celal Azal', 18, 255), ('Ahmet Kahraman', 12, 430)]
Koleksiyon tipi verilerin sığ ve derin kopyalanmalarını incelemiştik. Topluluklar için pg.copy() şeklinde, sığ kopyalama yöntemi uygulanamaz.
3.2.4 - Topluluk (Tuple) Tipi Verilerin Birbirleri ile Karşılaştırılmaları
İki topluluk verisini, eleman eleman karşılaştırırmak karşılaştırma işemcileri kullanılır. Bu g,b grup karşılaştırmalarının uygulama alanı çok azdır. Bu konuda bir uygulama örneği aşağıda görülmektedir.
tmp1 = (56, 99, 106)
tmp2 = (56, 45, 181)
print (tmp1>tmp2)
Program Sonucu :
False
Karşılştırma önce ilk elemanlar üzerine yapılır. Eğer eşitlik varsa, ikinci elemenlar denenir. Bu uygulamada da ilk elemanlar eşit oldukları için, karşılaştırma ikinci elemanlar arasında yapılmıştır. toplulukların incelenmesini burada tamamlıyor ve sözlük tipi verilere geçiyoruz.