Yazı dizimizin önceki bir bölümünde Python’un öntanımlı veri tiplerini yüzeysel bir şekilde işlemiştik. Bu yazıda ve takip eden birkaç yazıda liste, dize, sözlük ve küme veri tiplerini daha ayrıntılı işleyeceğiz ve bu tip verilerle yapılabilecek işlemleri sıralayacağız. Dizinin bütün yazılarına erişmek için Python Programlamaya Giriş kategorimize bakabilirsiniz. Bu dizideki yazılar ayrıca Jupyter defterleri halinde GitHub depomuzda da mevcut.
Nesneler ve metodlar
Temel kullanım için bunu bilmek çok gerekmese de, Python nesneye yönelik (object-oriented) bir dildir. Python’da tanımladığınız her şey bir nesnedir. Nesneler özel veri yapılarıdır; içlerinde verilerin yanı sıra, o verilerle yapılabilecek işlemleri tanımlayan fonksiyonlar barındırırlar. Söz gelişi, bir liste nesnesinin içinde elemanların değerleri, elemanların ne tipte olduğu, kaç eleman bulunduğu gibi veriler bulunur. Ayrıca listeye eleman ekleme, eleman çıkarma, sıralama gibi işlemler yapan fonksiyonlar da listeyi tanımlayan kodun içindedir. Veri tipinin (sınıfın) tanımı içinde bulunan fonksiyonlara o nesnenin metodları denir.
Herhangi bir veri tipi içinde tanımlanmış isimleri (veri veya metod) dir
fonksiyonuyla görebilirsiniz.
dir(list)
Burada altçizgilerle başlayıp biten isimler list
sınıfının (class) özel metodlarıdır. Bunlar kullanıcı tarafından doğrudan çağrılmamalıdır. Bu tür özel metodların bazıları, asıl metodlar için yardımcı işlemler olabilir. Bazıları ise in, +, *, <, ==
vs. gibi işlemlerin tanımlanmasında kullanılır. Söz gelişi, iki listenin eşit olup olmadığını anlamak için L1 == L2
ifadesini kullandığımızda bu L1.__eq__(L2)
biçimine getirilir.
Özel metodların nasıl kullanılıp tanımlanacağını ileride nesneye yönelik programlama konusunda göreceğiz. Şimdilik ilgimiz sadece “kamuya açık” (public) metodlarla, yani çevresinde altçizgiyle tanımlanmamış olan metodlarla sınırlı.
İlgili sınıfların ve metodların belge dizelerine (docstring) ulaşmak için help
fonksiyonunu kullanabilirsiniz.
help(list)
help(list.append)
Bu metodları örneklerle görelim.
Liste metodları
append
Listenin sonuna bir eleman ekler.
L = [1,"abc",3]
L.append("xyz")
L
clear
Listeyi siler, bütün elemanları kaldırır.
L = [1,2,5,3,5]
L.clear()
L
Aynısını del
ve dilimleme ile de yapabiliriz.
L = [1,2,5,3,5]
del L[:]
L
copy
Listenin bir kopyasını çıkarır.
L = [1,5,1,6,4]
L2 = L.copy()
L2
Böyle bir kopya, reverse
veya sort
gibi nesne içinde (in-place) değişiklik yapan metodlar kullanırken orijinal listenin değiştirilmemesini sağlar.
Aynı kopyalamayı dilimleme işlemi ile de yapabiliriz.
L3 = L[:]
L3
count
Listede belli bir değere sahip kaç eleman olduğunu verir.
L = [1,2,1,2,2,2,3,3,1,1]
L.count(1)
L = [(1,2), (1,2), (3,2), (2,1)]
L.count((1,2))
extend
Listenin sonuna bir liste ekleyerek genişletir.
L1 = [1, "abc", 3]
L2 = ["xyz", 5]
L1.extend(L2)
L1
Bunun append
‘den farklı olduğuna dikkat edin. Aynı işlemi append
ile yaparsak L2
listesi kendi başına L1
‘in son elemanı olur.
L1 = [1, "abc", 3]
L2 = ["xyz", 5]
L1.append(L2)
L1
Listelerde toplama (+
) işlemi ve artırma (+=
) işlemi arka planda extend
ile yapılır.
L1 = [1, "abc", 3]
L2 = ["xyz", 5]
L1 += L2
L1
index
Belli bir değerin ilk olarak hangi konumda olduğunu verir. Değer bulunamazsa ValueError
hatası çıkarır.
L = [12, "abc", -4, 11, "abc", 0.25, 64]
L.index("abc")
L.index("xyz")
Aradığımız değere sahip sonraki elemanları da bulmak istiyorsak, bulunan ilk konumu saklayıp, index
‘e sonraki konumdan başlayarak aramasını söyleyebiliriz.
L = [12, "abc", -4, 11, "abc", 0.25, 64]
yer = L.index("abc")
L.index("abc",yer+1)
[i for i,el in enumerate(L) if el=="abc"]
insert
Listede verilen konuma bir eleman sokar, sonraki elemanları kaydırır.
L = [1, 2, "abc", -45]
L.insert(3, "xyz") # Şimdi L[3] "xyz" oldu, -45 kaydı.
L
L.insert(0, -10) # en başa sokar.
L
L.insert(len(L), [3,1,4]) # en sona sokar. L.append([3,1,4]) ile aynı
L
pop
Belli bir konumdaki elemanın değerini verir ve listeden siler. Parametre almazsa son elemanı siler.
L = [1,2,"abc",4,5,"xyz"]
L.pop()
L
L.pop(2)
L
remove
Verilen bir değere sahip olan ilk elemanı bulur ve onu listeden siler. Değer listede yoksa ValueError
hatası verir.
L = [2,1,5,2,"abc",1,"abc",1]
L.remove("abc")
L
L.remove("abc")
L
L.remove("abc")
L
reverse
Liste elemanlarının sırasını kendi içinde (in-place) ters çevirir. DİKKAT: Yeni bir liste döndürmez, mevcut listeyi değiştirir. Eğer orijinal listeyi bozmak istemiyorsanız bir kopya çıkarmalısınız.
L = [3, 1, 4, 1, 5, 9]
L.reverse()
L
Görüldüğü gibi L
listesi değişmiş. Bunu istemiyorsanız, bir kopya çıkarıp onu ters çevirmelisiniz.
L = [3, 1, 4, 1, 5, 9]
L2 = L.copy()
L2.reverse()
print("L =",L)
print("L2 =",L2)
Tabii daha kestirme olarak, sondan başa adımlarla dilimleme de yapabiliriz. Bu da orijinal listeyi değiştirmez
L[::-1]
sort
Listeyi kendi içinde (in-place) sıralar. Sıralamadan sonra orijinal liste değişir.
L = [-4, -8, 1, 2, 1, 5, 9, 7]
L.sort()
L
Sırayı ters çevirmek için reverse=True
parametresi verilebilir.
L = [-4, -8, 1, 2, 1, 5, 9, 7]
L.sort(reverse=True)
L
key
parametresine bir fonksiyon verildiğinde bu fonksiyon önce her elemana uygulanır, sonuçlara göre sıralama yapılır. Sözgelişi, mutlak değerlere göre sıralama yapmak için:
L = [-4, -8, 1, 2, 1, 5, 9, 7]
L.sort(key=abs)
L
sort
metodu orijinal listede değişiklik yapar. Bu tür nesne içi (in-place) değişiklikler performansı biraz artırsa da, bazen orijinal listeyi bozmamak isteyebiliriz. O zaman iki seçeneğimiz var: Orijinal listenin bir kopyasını çıkarıp onu sıralarız:
L = [-4, -8, 1, 2, 1, 5, 9, 7]
L2 = L.copy()
L2.sort()
print("L =",L)
print("L2 =",L2)
Veya, daha önce gördüğümüz öntanımlı sorted
fonksiyonunu kullanırız:
sorted(L)
Hataya dikkat: Nesne içi değişiklik yapan metodlar
Yukarıda gördüğümüz sort
ve reverse
gibi metodlar, bağlı oldukları listenin verisini doğrudan doğruya değiştirirler. Buna nesne içi (in place) değiştirme denir. Geriye döndürdükleri bir değer yoktur.
L = [1,4,2,5]
print(L.sort())
Yeni başlayan programcıların yaptıkları yaygın bir hata L.sort()
çağrısını bir atamanın sağ tarafında kullanmaktır.
L2 = L.sort()
Programcı burada L2
‘nin L
‘nin sıralanmış hali olduğunu ummaktadır (aslında L2 = sorted(L)
yazması gerekirdi). Python bu atamayı sessizce yapar, ama aslında L2
‘yi bir listeye değil None
değerine atamıştır.
L2 is None
Programın içinde daha sonra L2
‘yi kullanmak isteyen programcı şaşırtıcı hata mesajlarıyla karşılaşabilir.
L2[0]
Bu sorunlardan kaçınmak için metodun çevrimiçi yardımına bakarak nesne içi değişiklik yapıp yapmadığını yoklamak gerekir.