Ders-18: Python Karakter Dizileri.
Python Karakter Dizileri
Karakter dizileri, adından da anlaşılacağı gibi, karakterlerin bir araya gelmesiyle oluşan bir dizidir. Karakter dizileri; tek, çift veya üç tırnak içinde gösterilen, öteki veri tiplerinden de bu tırnaklar aracılığıyla ayırt edilen özel bir veri tipidir. Teknik olarak ifade etmek gerekirse, bir nesneyi type()
fonksiyonu yardımıyla sorguladığımızda, eğer <class ‘str’> çıktısı alıyorsak bu nesne bir karakter dizisidir.
Şimdiye kadar karakter dizileri ile ilgili öğrendiğimiz şeylere ek olarak, karakter dizilerin metotlarından da söz edeceğiz.
Karakter Dizilerinin Öğelerine Erişmek
Bu başlı altında string yapıdaki karakter dizilerinin öğelerine tek tek yada bir grup olarak erişim sağlayacağız. Örneğin:
kelime="Python Öğreniyorum"
for i in kelime:
print i
Yukarıdaki kod yapısını daha önceki derslerimizden hatırlamışsınızdır. For döngülerinin kelime içerisinde dolaşma (iterasyon) özelliği vardı. kelime değişkeninde ki değeri içerisinde harf harf döngü oluşturduk ve her bir harfi ekrana yazdırdık.
Peki ben sadece ilk harfi yada herhangi bir harfi yazdırmak isteseydim:
kelime="Python Öğreniyorum"
print( kelime[0])
print( kelime[1])
print( kelime[8])
print( kelime[9])
print( kelime[10])
Yukarıda görüldüğü gibi kelime[0] ile kelimenin sıfırıncı elemanını yani ilk harfini alıyorum. Kelime değişkeninin sıfırıncı elemanı “P” harfidir. Dizilerin değer sırasının sıfırdan başladığını unutmayınız. Yukarıdaki kodların ekran çıktısı aşağıdaki gibi olacaktır.
P
y
Ö
ğ
r
Genel olarak şöyle bir formül belirleyebiliriz.
karakter_dizisi[öğe_sırası]
kelime="Python Öğreniyorum"
print(len(kelime))
len fonksiyonu ise karakter dizisinin uzunluğunu verir. Boşluk da bir karakter olduğundan boşluğunda sayılacağını unutmamalıyız. Yukarıdaki kodun çıktısı:
>>18 olacaktır.
Bir karakter dizisinin uzunluğunun 1 eksiği, o karakter dizisinin son öğesini verir.
kelime="Python Öğreniyorum"
print(kelime[len(kelime)-1])
Bu kodun ekran çıktısı:
>> m
olacaktır...
Eğer bir karakter dizisine öğe sırası olarak eksi değerli bir sayı verirsek Python o karakter dizisini sondan başa doğru okumaya başlayacaktır. Yukarıdaki kodu şöyle değiştirirsek aynı sonuca ulaşabiliriz.
kelime="Python Öğreniyorum"
print(kelime[-1])
Bu kodun ekran çıktısı:
>> m
olacaktır...
kelime="Python Öğreniyorum"
print(kelime[-2])
Bu kodun ekran çıktısı:
>> u
olacaktır...
Karakter Dizilerini Dilimlemek
Bir önceki bölümde bir karakter dizisinin istediğimiz öğesini, o öğenin sırasını belirterek nasıl elde edebileceğimizi gördük. Bu bölümde de benzer bir şey yapacağız. Ama burada yapacağımız şey, bir önceki bölümde yaptığımız işleme göre biraz daha kapsamlı bir işlem olacak.
Bu bölümde karakter dizilerini ‘dilimlemekten’ söz edeceğiz. Peki ‘dilimlemek’ derken neyi kastediyoruz? Burada karakter dizilerinin belirli bir bölümünü almaya çalışacağız. Aşağıdaki örneğe bir göz atınız.
site = "www.btogrenme.com"
>>> site[4:13]
'btogrenme'
>>> site[15:18]
'com'
>>> site[0:3]
'www'
Gördüğünüz gibi, karakter dizisine köşeli parantez içinde bazı değerler vererek bu karakter dizisini dilim dilim ayırdık. Peki bunu nasıl yaptık? Yukarıdaki örneklerde şöyle bir yapı gözümüze çarpıyor:
karakter_dizisi[alınacak_ilk_öğenin_sırası : alınacak_son_öğenin_sırasının_bir_fazlası]
Bu bilgileri kullanarak şöyle bir uygulama yazalım:
site1 = "www.google.com" site2 = "www.btogrenme.com" site3 = "www.milliyet.com" site4 = "www.yahoo.com" for isim in site1, site2, site3, site4: print("site: ", isim[4:-4])
Bu örnek Python’da dilimleme işlemlerinin yapısı ve özellikleri hakkında bize epey bilgi veriyor. Gördüğünüz gibi, hem artı hem de eksi değerli sayıları kullanabiliyoruz. Önceki bölümden hatırlayacağınız gibi, eğer verilen sayı eksi değerliyse Python karakter dizisini sağdan sola (yani sondan başa doğru) okuyacaktır. Yukarıdaki örnekte isim[4:-4]
yapısını kullanarak, site1, site2, site3, site4 adlı karakter dizilerini, ilk dört ve son dört karakterler hariç olacak şekilde dilimledik. Böylece elimizde ilk dört ve son dört karakter arasındaki bütün karakterler kalmış oldu. Yani “google”, “btogrenme”, “milliyet” ve “yahoo”.
Bir örnek daha
Bütün bu anlattıklarımızı daha iyi anlayabilmek için bir örnek daha verelim:
ata1 = "Akıllı bizi arayıp sormaz deli bacadan akar!" ata2 = "Ağa güçlü olunca kul suçlu olur!" ata3 = "Avcı ne kadar hile bilirse ayı da o kadar yol bilir!" ata4 = "Lafla pilav pişse deniz kadar yağ benden!" ata5 = "Zenginin gönlü oluncaya kadar fukaranın canı çıkar!" Burada beş adet atasözü verdik. Bizim görevimiz, bu atasözlerinin sonunda bulunan ünlem işaretlerini ortadan kaldırmak:
for ata in ata1, ata2, ata3, ata4, ata5:
print(ata[0:-1])
Burada yaptığımız şey şu: ata1, ata2, ata3, ata4 ve ata5 adlı değişkenlerin her birini ata olarak adlandırdıktan sonra ata adlı değişkenin en başından en sonuna kadar olan kısmı dilimleyip aldık. Yani ata[0]
ile ata[-1]
arasında kalan bütün karakterleri elde etmiş olduk. Peki bu ünlem işaretlerini kaldırdıktan sonra bunların yerine birer nokta koymak istersek ne yapacağız?
O da çok basit bir işlem:
for ata in ata1, ata2, ata3, ata4, ata5:
print(ata[0:-1] + ".")
Gördüğünüz gibi, son karakter olan ünlem işaretini attıktan sonra onun yerine bir nokta işareti koymak için yaptığımız tek şey, dilimlediğimiz karakter dizisine, artı işareti (+) yardımıyla bir . karakteri eklemekten ibarettir.
Bir örnek daha…
Elimizde şöyle dört adet internet sitesi adresi olsun:
site1 = "www.google.com" site2 = "www.istihza.com" site3 = "www.yahoo.com" site4 = "www.btogrenme.org"
Bizim amacımız bu adreslerin her birinin baş tarafına http:// ifadesini eklemek. Bunun için de yine karakter dizisi birleştirme işlemlerinden yararlanabiliriz. Dikkatlice inceleyin:
site1 = "www.google.com" site2 = "www.istihza.com" site3 = "www.yahoo.com" site4 = "www.gnu.org" for i in site1, site2, site3, site4: print("http://", i, sep="")
Eğer www. kısımlarını atmak isterseniz karakter dizisi birleştirme işlemleri ile birlikte dilimleme yöntemini de kullanmanız gerekir:
for i in site1, site2, site3, site4: print("http://", i[4:], sep="")
Bir örnek daha…
Diyelim ki, bir kelime içindeki sesli ve sessiz harfleri birbirinden ayırmanız gereken bir program yazıyorsunuz. Yani mesela amacınız ‘istanbul’ kelimesi içinde geçen ‘i’, ‘a’ ve ‘u’ harflerini bir yerde, ‘s’, ‘t’, ‘n’, ‘b’ ve ‘l’ harflerini ise ayrı bir yerde toplamak. Bunun için şöyle bir program yazabilirsiniz:
sesli_harfler = "aeıioöuü"
sessiz_harfler = "bcçdfgğhjklmnprsştvyz"
sesliler = ""
sessizler = ""
kelime = "istanbul"
for i in kelime:
if i in sesli_harfler:
sesliler += i
else:
sessizler += i
print("sesli harfler: ", sesliler)
print("sessiz harfler: ", sessizler)
Burada öncelikle şu kodlar yardımıyla Türkçedeki sesli ve sessiz harfleri belirliyoruz:
sesli_harfler = "aeıioöuü"
sessiz_harfler = "bcçdfgğhjklmnprsştvyz"
Ardından da, sesli ve sessiz harflerini ayıklayacağımız kelimedeki sesli harfler ve sessiz harfler için boş birer karakter dizisi tanımlıyoruz:
sesliler = ""
sessizler = ""
Programımız içinde ilgili harfleri, o harfin ait olduğu değişkene atayacağız.
Kelimemiz “istanbul”:
kelime = "istanbul"
Şimdi bu kelime üzerinde bir for
döngüsü kuruyoruz ve kelime içinde geçen herbir harfe tek tek bakıyoruz. Kelime içinde geçen harflerden, sesli_harfler değişkeninde tanımlı karakter dizisinde geçenleri sesliler adlı değişkene atıyoruz. Aksi durumda ise, yani kelime içinde geçen harflerden, sessiz_harfler değişkeninde tanımlı karakter dizisinde geçenleri, sessizler adlı değişkene gönderiyoruz:
for i in kelime:
if i in sesli_harfler:
sesliler += i
else:
sessizler += i
Bunun için for
döngüsü içinde basit bir ‘if-else’ bloğu tanımladığımızı görüyorsunuz. Ayrıca bunu yaparken, sesliler ve sessizler adlı değişkenlere, for
döngüsünün her bir dönüşünde yeni bir harf gönderip, bu değişkenleri, döngünün her dönüşünde yeni baştan tanımladığımıza dikkat edin. Çünkü, dediğimiz gibi, karakter dizileri değiştirilemeyen veri tipleridir. Bir karakter dizisi üzerinde değişiklik yapmak istiyorsak, o karakter dizisini baştan tanımlamamız gerekir.