14: Metotlar

Şu ana kadar Python'daki iki veri yapısını gördük: stringler ve listeler. Bu iki yapı da, fonksiyonların varyantları olan bazı metotları desteklemektedir.

Mesela reverse() metodu list  ile kullanabileceğimiz bir metottur. İsminden anlaşılabileceği gibi bu, liste elementlerini tersten (yani ilk element en sona, son element en başa gelecek şekilde) sıralama metodudur. Bu metodu çağırmak için nokta ( . ) kullanarak şöyle bir yapı oluştururuz:

«nesneAdı».«metodunAdı»(«argüman listesi, eğer varsa»)

Karşılaştırmak üzere, fonksyionları çağırdığımakta kullandığımız sentaksı hatırlayalım

«fonksiyonAdı»(«argüman listesi, eğer varsa»)

Bir liste üzerinde reverse metodunu kullandığımız bir örneğe bakalım.

Example
Bir listeyi tersine çevirmek.

Argüman olarak str.startswith alan bir metoda bakalım:

Example
Bazı string metotları.

Pek çok metot

Aşağıda liste ve string sınıflarında en sık kullanılan metotları göreceksiniz. Bu metotların yaptığı işlemler sizin de yazabiliyor olmanız gereken çözümler, ama standart metotları kullanmak kodunuzun yazılmasını, okunmasını ve düzenlenmesini kolaylaştırır.

Listeler

Bu metotlar listenizi değiştirmez:

  • list.index(X): Listede  X elemanını bulmak. Özellikle, bu list[i]==X listeyi tarayarak elemanını getirir. En küçük  i getirilir. Eğer listede X bulunmuyorsa, bu ValueError değer hatasına sebep olur..
    • Eğer X listede yer alıyorsa X in list yapısıTrue, yer almıyorsa  False  sonucunu getirir. Bunu kullanmakla ValueErrorhatasından kaçınılabilir. (in bir işlemcidir, metot değildir.)
  • list.count(X)X elemanının listede kaç kez yer aldığını getirir.

Example
Liste metotları.

Şu metotlar listeyi değiştirir:

  • list.append(X) metodu list listesinin sonuna X elemanını ekler.
  • list.insert(i, X) metodu X elemanını i konumuna yerleştirir.
  • list.extend(L) metodu listenin sonuna L listesindeki elemanları ekler.
  • list.remove(X) metodu X elemanını ik bulunduğu yerden siler.
  • list.pop(i) metodu list[i] elemanını; list.pop() ise en sondaki elemanı siler ve getirir.
  • del list[i] metodu list listeinin i indeksinde yer alan elemanı siler (Bu bir "del ifadesi"dir, metot değildir.)
  • list.reverse() listeyi tersine çevirir.
  • list.sort() listeyi düzene sokar.

Yukarıdaki metotlar pop hariç None sonucunu getirir. Bu fonksiyonlar biraz farklı argümanlarla da çağrılabilir; tüm detayları görmek için  Python kaynaklarından liste metotlarını inceleyebilirsiniz. Listeler aynı zamanda "dilim" dediğimiz listelerin parçalara ayrılmasıyla alt aralıklarda silme ve yerleştirme işlemlerine olanak sağlar, tıpkı önceki derslerde gördüğümüz string[x:y:z] notasyonu gibi.

Coding Exercise: Yer Değiştirmeler
index ve diğer liste metotlarını kullanarak,  replace(list, X, Y) fonksiyonu yazın. Bu fonksiyon  list  içerisindeki  X elmanınını Y ile değiştirsin. Mesela, listemiz L = [3, 1, 4, 1, 5, 9] olsun, replace(L, 1, 7) fonksiyonunun yapacağı işlemle liste içeriği L to [3, 7, 4, 7, 5, 9]olmalı.  Alıştırmayı zorlaştıralım; [] kullanmak yok.
Not: return  kullanmanıza gerek yok.İpucu
Enter testing statements like print(myfunction("test argument")) below.

Stringler

Listelerede kullandığımız  inindex ve count yapılarını stringlerle de kullanabiliriz. They are even more powerful, since they work with substrings too and not just finding individual characters:

  • S in T bir bool'dur ve  S stringinin  T içerisinde yer alıp almadığını kontrol eder
  • S.index(T) T altstringinin S indeksini verir
  • S.count(T) S stringi içinde yer alan T substringinin kaç kez geçtiğinin sayısını verir

Example
Stringlerde index ve count bulmak.

En çok kullanılan str metotlarından bazıları:

  • Büyük-küçük harf: capitalize, lower, upper, islower, isupper
  • Karakter: isalpha, isdigit
  • Hizalama: center, ljust, rjust; strip hizalamayı siler
  • Alt stringler: endswith, startswith, find, replace
  • Ayırma: split, splitlines

Yeri geldikçe bunları daha ayrıntılı açıklayacağız. Bunların detaylı ve eksiksiz listesini string metotları olarak Python kaynakalrından inceleyebilirsiniz.

Stringler değiştirilemez. Yukarıda listeleri ters yüz eden list.reverse() yapısını görmüştük, stringler için str.reverse() gibi metot söz konusu değildir. Bunun sebebi stirnglerin değiştirilemez oluşudur. 17. derste bunun hakkında biraz daha konuşacağız.

String metotları hakkında bir örneğe bakalım: S.replace(eski, yeni) S'yi eski substringi (altstringi) yerine yeni yazararak değiştirir. Eskini değiştirmeksizin yeni bir strign oluşturur:

Example
Example: replace yeni string getirir ve orijinali değiştirmez.

Bir sonraki alıştırma için şu metotlar kullanışlı olacak:

  • str.replace, şimdi gördüğümüz metot
  • boolean metodu olan str.isalpha() eğer str stringi (veya karakter) sadece harflerden oluşuyorsa True sonucunu verir
  • bir başka boolean metodu str.isdigit() eğer str stringi (veya karakter) sadece rakamlardan oluşuyorsa True sonucunu verir True if
  • str.upper() metodu str stringindeki karakterlerin hepsini büyük harfle yazar.

Coding Exercise: Posta Kodları
S'in geçerli bir posta kodu olup olmadığını kontrol eden bir postalValidate(S) fonksiyonu yazın:

  • önce, tüm boşlukları sil;
  • kalanlar L#L#L# şeklinde, L yerine harf (küçk harf- büyük harf farketmez) ve# yerine de sayılar olmalı.

Eğer S geçerli bir posta kodu değilse False boolean terimini versin. Eğer S geçerli ise, aynı posta kodunu tüm L'ler büyük olacak şekilde L#L#L# formatında yazdırsın.

Enter testing statements like print(myfunction("test argument")) below.

Dersin devamında, gelecek derserde fazla ihtiyaç duymayacağınız teknik bilgiler bulunuyor.

Nesneler Hakkında

Python bilginiz arttıkça, string ve listelerdan başka sınıflar olduğunu da göreceksiniz. İşinize yarayabilecek diğerleri; file objects (dosya nesneleri), sets (setler) ve dictionaries (sözlükler). Hepsinde kullanışlı metotlar var. Python'a mevcut nesneye ait bütün metotları dir fonksiyonunu kullanarak sorabilirsiniz:

Example
 str için geçerli metotlar. Gördüğünüz gibi startswith çıktlardan birisi.

Bir nesnenin özelliklerine (properties) bakmak introspection (içgözlem) olarak adlandırılır. Python'da tüm nesnelerin metotları vardır:

Example
Bir int dâhilindeki üyeler.

dir içerisindeki bazı girişler aslında metot değil üye değişkenlerdir (member variables), mesela   int.denominator bir fonksiyon değil bir sayıdır. Teknik olarak, Python'daki fonksiyonlar nesnedir, yani üye fonksiyonlar, üye değişknelerin özel bir durumudur.

Modüllerde de introspection yapılabilir. Eğer import math yapıp sonra da  dir(math) çağırırsanız, pi sayısı ve sqrt fonksiyonu dâhil olmak üzere  math modülü içerisindeki her şeyin bir listesini elde edersiniz.

Neden nesneler?

index(S, T) gibi basit fonksiyonlar varken neden  S.index(T) şeklinde metotlar kullanıyoruz? Başka bir deyişle niçin S gibi nesnlere ve str.index() metotlara neden ihtiyaç var?

Nesnelerin asıl büyük faydalarını daha karmaşık ve farklı tipten datalarla programlamaya başladığınızda göreceksiniz. Her tipten obje (örn. str class) hem depolanan verinin esasını (mesela, bir karakterler dizisi ve onun uzunluğu) ve üzerinde yapılabilecek işlem tiperini (mesela, büyük harfe çevrimek veya altstringlerini oluşturmak) temsil eder. Daha karmaşık bir örnek olarak dosya nesneleri (file objects): açılan dosyanın adını, dosyadaki mevcut durumunuzu ve okuma ve yazmak için kullanacağınız metotları ifade eder. Hatta kendi data tiplerinizi beirleyebilirsiniz!

Bu genel yaklaşım "object-oriented programming" (OOP) [Nesne Yönelimli Programlama] olarak adlandırılır. Bu yaklaşımın bazı faydaları şunlardır:

  • organizasyon:  math modülündeki her şeye math.«name» sentaksıyla ulaşarak programınızda mevcut değişken adlarının üzerine yazılma ihtimalinden kaçınmış olursunuz.
  • kapsülleme: Bir programın aynı anda birkaç string veya dosya ile çalışabildiği gibi, herhangi bir başka classta tanımlanmış pek çok farklı data tipinden kopyalarla (instances) çalışabilirsiniz.
  • tekrar kullanma: Bir kez bir data tipi (str gibi) veya bir metot kütüphanesi  (math gibi) tanımladıktan sonra onu tekrar tekrar kullanabilir, kullanmaları için başkalarına verebilirsiniz.
  • hata ayıklama: Daha önceden gördüğümüz gibi bir fonksiyon tanımlayarak benzer kodları defalarca yazmak zorunluluğundan kurtuluruz. Bir data tipi ile ilgili fonksiyonları bir tek yerde yazmakla (class definition/sınıf tanımlama) da aynı kolaylığı sağlarız.
  • Sınıflar arası ilişkiler: Python index metodunun string için bir şey, list için başka anlama geldiğini bilir. Aynı şekilde Python, yalnız bilgisyardaki dosyalarınız üzerinde değil internet üzerinde de data yazıp okuma işlemi yapabilir. Her iki hâlde de (karakter veya list dizileri, lokal veya uzak dosyalar) ilgili sınıflar miras (inheritance) kavramı çerçevesinde tek şekilde ele alınabilir.

CS Circles'ın devamında  sadece nesneleri ve metotları kullanacağız; kendi sınıflarınızı oluşturma konusunda ileride daha çok bilgi edineceksiniz. (bkz. Kaynak sayfaları).

Bundan sonraki üç dersi istediğiniz sırayla yapabilirsiniz. Bu derslerde daha önceden öğrendiklerimizi bir arada kullanmamızı gerektirecek karmaış problemlerle karşılaşacaksınız.