• Sonuç bulunamadı

4.6 “in” Parçacı ˘ gı ile Aitlik Kontrolü

5.1 Demetleri Tanımlamak

Bir önceki bölümde demetler konusuna kısaca bir giri¸s yapmı¸stık. O bölümde, demetlerin listelere benzedi˘gini ifade etmi¸stik. Hatırlarsanız listeleri ¸söyle tanımlıyorduk:

>>> liste = []

Burada bo¸s bir liste tanımladık. Demetler de buna benzer bir ¸sekilde tanımlanır:

>>> demet = ()

Gördü˘günüz gibi, listelerdeki kö¸seli parantezlerin yerini demetlerde normal parantezler alıyor...

˙Isterseniz yukarıda tanımladı˘gımız veri tiplerinin sa˘glamasını yapalım:

>>> type(liste)

<class ’list’>

Demek ki tanımladı˘gımız ¸sey gerçekten de bir listeymi¸s... Bir de ¸suna bakalım:

>>> type(demet)

<class ’tuple’>

Burada gördü˘gümüz “tuple” ifadesi Türkçe’de “demet” anlamına geliyor. Demek ki burada olu¸sturdu˘gumuz veri tipi gerçekten de bir demetmi¸s...

Daha önce “dir(list)” komutunu kullanarak, listelerin metotlarını sıralamayı ö˘grenmi¸stik. ¸Simdi de demetlerin metotlarına bakalım:

>>> dir(tuple)

[’__add__’, ’__class__’, ’__contains__’, ’__delattr__’, ’__doc__’,

’__eq__’, ’__format__’, ’__ge__’, ’__getattribute__’, ’__getitem__’,

’__getnewargs__’, ’__gt__’, ’__hash__’, ’__init__’, ’__iter__’,

’__le__’, ’__len__’, ’__lt__’, ’__mul__’, ’__ne__’, ’__new__’,

’__reduce__’, ’__reduce_ex__’, ’__repr__’, ’__rmul__’, ’__setattr__’

, ’__sizeof__’, ’__str__’, ’__subclasshook__’, ’count’, ’index’]

Daha önce listelerin metotlarını almak için kullandı˘gımız “list” yerine burada “tuple” kelimesini yazdı˘gımıza dikkat edin. Elbette dir() metodunu ¸su ¸sekilde kullanabilece˘gimizi de tahmin ediyorsunuzdur:

>>> dir(demet)

Burada daha önce tanımladı˘gımız “demet” adlı ö˘geden yararlandık. Hatta istersek ¸söyle bir

¸

sey bile yazabiliriz:

>>> dir(())

Burada ise, demetlerin ayırt edici özelli˘gi olan parantezleri kullandık. Benzer bir ¸seyi listeler için yapmak isteseydik ¸söyle bir yazım tarzı benimseyecektik:

>>> dir([])

Burada da listelerin ayırt edici özelli˘gi olan kö¸seli parantezlerden faydalandık...

dir(tuple) komutundan elde etti˘gimiz çıktılar arasında, içinde “__” i¸sareti olmayanlar bizim ilgi alanımıza giren metotlar oluyor. Tıpkı daha önce listeler için yaptı˘gımız gibi burada da ufak bir-iki satırlık kod yardımıyla dir(tuple) çıktısı içinde bizim ilgimizi çeken metotları alabiliriz:

>>> for i in dir(tuple):

... if "_" not in i:

... print(i)

...

count index

Demek ki demetlerin yalnızca iki adet metodu varmı¸s. Demetlerin metot sayısı listelere kıyasla epey az. Bunun nedeni, daha önce bahsetti˘gimiz “de˘gi¸stirilebilme/de˘gi¸stirilememe” mese-lesidir... Demetler, listelerin aksine de˘gi¸stirilemeyen veri tipleri oldu˘gu için, do˘gal olarak, de˘gi¸siklik yapmaya yönelik metotlara sahip de˘gildir. Listeler ise de˘gi¸stirilebilen veritipleri oldu˘gu için,append(), extend() ve remove() gibi, liste üzerinde de˘gi¸siklik yapmayı sa˘glayan metotlar barındırır. Zaten dikkat ederseniz, demetlerin sahip oldu˘gu bu iki metot da de˘gi¸siklik yapmaya de˘gil, bir demetin ö˘geleri hakkında bilgi vermeye yöneliktir. dir(tuple) komutundan elde etti˘gimiz çıktıda görünenindex() ve count() metotlarının ne i¸se yaradı˘gını az çok tahmin edersiniz. Bunları zaten listeleri i¸slerken de görmü¸stük. Burada da i¸slevleri aynıdır.

Peki demetler ne i¸se yarar? Yani listeler gibi oldukça güçlü bir veri tipi önümüzde dururken demetleri kim takar!.. Elbette Python geli¸stiricileri çe¸sit olsun diye yerle¸stirmemi¸sler demet diye bir ¸seyi dilin içine... Demetlerin de gerekli oldu˘gu yerler vardır.

Bir defa demetler listelere kıyasla daha hızlı çalı¸sırlar. Dolayısıyla üzerinde de˘gi¸siklik yapmanız gerekmeyecek ö˘geleri gruplarken listeler yerine demetleri kullanmayı tercih edebilirsiniz.

Ayrıca demetler de˘gi¸stirilemeyen bir veri tipi oldu˘gu için, bu veri tipini, program boyunca de˘gi¸smesini istemedi˘gimiz ö˘geleri gruplamak için de kullanabiliriz. Yani bir bakıma “salt-okunur” ö˘geleri demetler içinde saklamayı tercih edebiliriz...

Örnek olması açısından bir demet tanımlayalım:

>>> personel = ("Mehmet", "Ahmet", "Zeliha")

Böylelikle üç ö˘geli bir demet tanımlamı¸s olduk. Listelerle yapabildi˘gimiz bazı ¸seyleri demetlerle de yapabiliriz. Mesela:

>>> personel[0]

’Mehmet’

>>> personel[:-1]

(’Mehmet’, ’Ahmet’)

>>> personel[::-1]

(’Zeliha’, ’Ahmet’, ’Mehmet’)

Ama tabii ki ¸söyle bir ¸sey mümkün de˘gildir:

>>> personel[1] = "˙Ilkay"

Neden? Çünkü, daha önce de birkaç kez söyledi˘gimiz gibi, demetler üzerinde de˘gi¸siklik yapa-mayız. Demetler “de˘gi¸stirilemeyen” (immutable) veri tipleridir.

Demetlerin ilginç bir özelli˘gi daha vardır. Her ne kadar demetlerin ayırt edici özelli˘gi “()” i¸sareti olsa da demetleri tanımlamak için parantez kullanmak zorunda de˘giliz:

>>> a = "Ahmet", "Mehmet", "Zarife"

Hemen bu “a” de˘gi¸skeninin tipini kontrol edelim:

>>> type(a)

<class ’tuple’>

Gördü˘günüz gibi, parantezleri kullanmadan da demet tanımlayabiliyoruz. Bu demek oluyor ki, aslında bir de˘gi¸skene birden fazla de˘ger atadı˘gımızda yaptı˘gımız ¸sey bir demet tanımlamak.

Tek ö˘geli bir de˘gi¸sken, içinde sakladı˘gı verinin tipiyle anılır. Yani:

>>> hava = "ya˘gmurlu"

>>> type(hava)

<class ’str’>

Bir de ¸suna bakalım:

>>> hava = 10

>>> type(hava)

<class ’int’>

...ama birden fazla ö˘ge barındıran de˘gi¸skenler tip olarak birer demettir...

Mesela:

>>> hava = "ya˘gmurlu", "bulutlu", "rüzgârlı"

>>> type(hava)

<class ’tuple’>

Ya da:

>>> hava = 10, 15, 17

>>> type(hava)

<class ’tuple’>

Elbette, e˘ger istersek yukarıdaki demetlerin ö˘gelerini parantez içinde de belirtiriz. Bu ¸sekilde hangi tür bir veri tipi tanımladı˘gımızı daha açık ve net bir ¸sekilde belli etmi¸s oluruz.