Python'da Karakter Dizilerinin Metotları
Pardus-Linux.org | Wiki sitesinden
Forum'da bu konunun tartışma adresi: http://forum.pardus-linux.org/viewtopic.php?f=185&t=17214
[değiştir] Karakter Dizilerinin Metotları
[değiştir] Giriş
Bu bölümde, Python'daki karakter dizilerinin (strings) sahip oldukları "metot"lardan söz edeceğiz. Metotlar; Python'da bir karakter dizisinin, bir sayının, bir listenin veya sözlüğün niteliklerini kolaylıkla değiştirmemizi veya bu veritiplerine yeni özellikler katmamızı sağlayan küçük "parçacıklar"dır. Aslında bu metotları daha önceki derslerimizde de görmüştük. Örneğin listeler konusunu işlerken sözünü ettiğimiz "parçacıklar" aslında bu bölümde bahsedeceğimiz metotlara birer örnek oluşturur. Yani örneğin, daha önce "append parçacığı" olarak bahsettiğimiz öğe, listelerin bir metodudur. Artık Python'da yeterince ilerleme sağladığımıza göre, daha önce kafa karıştırıcı olmaması için kullanmaktan kaçındığımız terimleri bundan sonra rahatlıkla kullanabilir, bunları hakiki şekilleriyle öğrenmeye girişebilir ve dolayısıyla Python'un terim havuzunda gönül rahatlığıyla kulaç atabiliriz...
Sözün özü, bu bölümde önceden de aşina olduğumuz bir kavramın, yani metotların, karakter dizileri üzerindeki yansımalarını izleyeceğiz. Önceki yazılarımızda işlediğimiz listeler ve sözlükler konusundan hatırlayacağınız gibi, Python'da metotlar genel olarak şu şablona sahip oluyorlar:
veritipi.metot
Dolayısıyla Python'da metotları gösterirken "noktalı bir gösterme biçiminden"den söz ediyoruz. Daha önce sözünü ettiğimiz "append" metodu da dikkat ederseniz bu şablona uyuyordu. Hemen bir örnek hatırlayalım:
liste = ["elma", "armut", "karpuz"]
liste.append("kebap")
liste
["elma", "armut", "karpuz", "kebap"]
Gördüğünüz gibi, noktalı gösterme biçimini uygulayarak kullandığımız "append" metodu yardımıyla listemize yeni bir öğe ekledik.
İşte bu yazımızda, yukarıda kısaca değindiğimiz metotları karakter dizilerine uygulayacağız.
[değiştir] Kullanılabilir Metotları Listelemek
Dediğimiz gibi, bu yazıda karakter dizilerinin metotlarını inceleyeceğiz. Şu halde isterseniz gelin Python'un bize hangi metotları sunduğunu topluca görelim.
Mevcut metotları listelemek için birkaç farklı yöntemden faydalanabiliriz. Bunlardan ilki şöyle olabilir:
dir(str)
Burada dir() fonksiyonuna parametre (argüman) olarak "str" adını geçiyoruz. "str", İngilizce'de karakter dizisi anlamına gelen "string" kelimesinin kısaltması oluyor. Yeri gelmişken söyleyelim: Eğer karakter dizileri yerine listelerin metotlarını listelemek isterseniz kullanacağınız biçim şu olacaktır:
dir(list)
Sözlüklerin metotlarını listelemek isteyen arkadaşlarımız ise şu ifadeyi kullanacaktır:
dir(dict)
Ama bizim şu anda ilgilendiğimiz konu karakter dizileri olduğu için derhal konumuza dönüyoruz. dir(str) fonksiyonu dışında, karakter dizilerini listemek için şu yöntemden de yararlanabiliriz:
dir("")
Açıkçası benim en çok tercih ettiğim yöntem de budur. Zira kullanılabilecek yöntemler içinde en pratik ve kolay olanı bana buymuş gibi geliyor!.. Burada gördüğünüz gibi, dir() fonksiyonuna parametre olarak boş bir karakter dizisi veriyoruz. Biliyorsunuz, Python'da karakter dizileri tırnak işaretleri yardımıyla öteki veritiplerinden ayrılıyor. Dolayısıyla içi boş dahi olsa, yan yana gelmiş iki adet tırnak işareti, bir karakter dizisi oluşturmak için geçerli ve yeterli şartı yerine getirmiş oluyor. İsterseniz bunu bir de type() fonksiyonunu kullanarak test edelim (Bu fonksiyonu önceki yazılarımızdan hatırlıyor olmalısınız):
a= "" type(a) <type 'str'>
Demek ki gerçekten de bir karakter dizisi oluşturmuşuz. Şu halde emin adımlarla yolumuza devam edebiliriz.
Karakter dizisi metotlarını listelemek için kullanabileceğimiz bir başka yöntem de dir() fonksiyonu içine parametre olarak doğrudan bir karakter dizisi vermektir. Bu yöntem, öteki yöntemler içinde en makul yöntem olmasa da, en fazla kodlama gerektiren yöntem olması açısından parmak aşındırmak için iyi bir yöntem sayılabilir:
dir("herhangibirkelime")
Dediğim gibi, fonksiyon içinde doğrudan bir karakter dizisi vermenin bir anlamı yoktur. Ama Python yine de sizi kırmayacak ve öteki yöntemler yardımıyla da elde edebileceğiniz şu çıktıyı ekrana dökecektir:
['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__', '__ge__','__getattribute__', '__getitem__', '__getnewargs__', '__getslice__', '__gt__', '__hash__', '__init__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', ' __new__', '__reduce__','__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__str__', 'capitalize', 'center', 'count', 'decode', 'encode', 'endswith', 'expandtabs', 'find', 'index', 'isalnum', 'isalpha', 'isdigit', 'islower', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
Gördüğünüz gibi, Python'da karakter dizilerinin bir hayli metodu varmış... Eğer bu listeleme biçimi gözünüze biraz karışık göründüyse, elbette çıktıyı istediğiniz gibi biçimlendirmek sizin elinizde:
Mesela önceki bilgilerinizi de kullanıp şöyle bir şey yaparak çıktıyı biraz daha okunaklı hale getirebilirsiniz:
for i in dir(""):
print i
Hatta kaç adet metot olduğunu da merak ediyorsanız şöyle bir yol izleyebilirsiniz. ("Elle tek tek sayarım," diyenlere teessüflerimi iletiyorum...)
print len(dir(""))
Şimdi sıra geldi bu metotları tek tek incelemeye... Yalnız öncelikle şunu söyleyelim: Bu bölümde "__xxx__" şeklinde listelenmiş metotları incelemeyeceğiz. Karakter dizisi metotları dendiği zaman temel olarak anlaşılması gereken şey, dir("") fonksiyonu ile listelenen metotlar arasında "__xxx__" şeklinde GÖSTERİLMEYEN metotlardır. "__xxx__" şeklinde gösterilenler "özel metotlar" olarak adlandırılıyorlar ve bunların, bu yazının kapsamına girmeyen, farklı kullanım alanları var.
Bunu da söyledikten sonra artık asıl konumuza dönebiliriz:
[değiştir] capitalize metodu
Bu metot yardımıyla karakter dizilerinin ilk harflerini büyütmemiz mümkün oluyor. Örneğin:
"adana".capitalize() Adana
Ya da değişkenler yardımıyla:
a = adana a.capitalize() Adana
Yalnız dikkat etmemiz gereken bir nokta var: Bu metot yardımıyla birden fazla kelime içeren karakter dizilerinin sadece ilk kelimesinin ilk harfini büyütebiliyoruz:
a = "lütfen parolanızı giriniz" a.capitalize()
Tabii, burada karakter dizimiz Türkçe harfler içerdiği için komutu print ile birlikte vermemiz daha uygun olabilir:
print a.capitalize()
Bir örnek:
a = ["elma","armut","kebap","salata"]
for i in a:
print i.capitalize()
Elma
Armut
Kebap
Salata
[değiştir] upper metodu
Bu metot yardımıyla tamamı küçük harflerden oluşan bir karakter dizisinin bütün harflerini büyütebiliyoruz:
"enflasyon".upper() ENFLASYON
Yalnız bu metodun Türkçe karakterlerle ufak bir sorunu var. Yani bu metot, "şçöğüı" gibi Türkçe karakterleri doğrudan büyütemiyor:
"şeker".upper() '\xc5\x9fEKER'
Burada şu komut da işe yaramayacaktır:
print "şeker".upper() şEKER
Bu metodun Türkçe karakterleri de büyütebilmesi için ufak bir işlem yapmamız gerekiyor. Öncelikle Python'un "locale" adlı modülünü içe aktarıyoruz (import). Ondan sonra da dil ayarlarında küçük bir düzenlemeye gidiyoruz:
import locale locale.setlocale(locale.LC_ALL,"")
Ardından şu komutu veriyoruz:
print u"şeker".upper() ŞEKER
Bu şekilde Türkçe karakter sorunumuzu halletmiş olduk. Dikkat ederseniz, "şeker" karakter dizisinin başına "u" harfi koyduk. Bu Python'da "unicode" adlı bir veritipine işaret ediyor. "unicode" veritipini ilerleyen derslerimizde daha ayrıntılı olarak inceleyeceğiz. Şimdilik, karakter dizilerinin başına "u" harfi getirerek bunları "unicode" adlı bir veritipine dönüştürdüğümüzü bilmemiz yeterli olacaktır. Ufak bir test yapalım:
a = "şeker" type(a) <type 'str'><pre> <pre> b = u"şeker" type(b) <type 'unicode'>
Bu test sayesinde tip farklılığını açıkça görebiliyoruz.
Yukarıdaki örnekte de görüldüğü gibi, bazı durumlarda Türkçe karakterleri görüntüleyebilmek için, karakter dizilerini "unicode"ye dönüştürmemiz gerekiyor.
Birkaç örnek daha yapalım:
kelime = "usturupsuz" kelime.upper() USTURUPSUZ kelime = u"türkçe sözcükler" #kelime değişkenini "unicode" olarak tanımladığımıza dikkat edin. kelime.upper() TÜRKÇE SÖZCÜKLER
Burada şöyle bir hatırlatma yapalım: Eğer komutlarımızı Python komut satırından (etkileşimli kabuk) veriyorsak, Türkçe karakterleri düzgün görüntüleyebilmek için her oturumda sadece bir kez şu komutu vermemiz gerekiyor:
import locale locale.setlocale(locale.LC_ALL,"")
Dediğimiz gibi, bu komutu bir kez verdikten sonra, aynı oturum içinde bir daha bu komutu vermeye gerek kalmadan işlemlerimizi yapabiliriz.
[değiştir] lower metodu
Bu metot "upper" metodunun yaptığı işin tam tersini yapıyor. Yani büyük harflerden oluşan karakter dizilerini küçük harfli karakter dizilerine dönüştürüyor:
a = "ARMUT" a.lower() armut
Tıpkı upper metodunda olduğu gibi burada da Türkçe karakterleri düzgün görüntüleyebilmek için bir kereliğine şu işlemi yapmamız gerekiyor:
import locale locale.setlocale(locale.LC_ALL,"")
Ancak şunu unutmayın, eğer o anda açık olan komut satırı oturumunda bu komutu önceden zaten bir kez vermişseniz, o oturum boyunca bir daha bu komutu vermenize gerek yok.
Şimdi karakter dizimizi "unicode" olarak tanımlıyoruz:
b = u"TÜRKÇE"
Artık metodumuzu kullanabiliriz:
print b.lower() türkçe
[değiştir] swapcase metodu
Bu metot da karakter dizilerindeki harflerin büyüklüğü/küçüklüğü ile ilgilidir. Metodumuz bize, bir karakter dizisinin o anda sahip olduğu harflerin büyüklük ve küçüklük özellikleri arasında geçiş yapma imkanı sağlıyor. Yani, eğer o anda bir harf büyükse, bu metodu kullandığımızda o harf küçülüyor; eğer bu harf o anda küçükse, bu metot o harfi büyük harfe çeviriyor. Gördüğünüz gibi, bu metodun ne yaptığını, anlatarak açıklamak zor oluyor. O yüzden hemen birkaç örnek yapalım:
a = "kebap" a.swapcase() KEBAP b = "KEBAP" b.swapcase() kebap c = "KeBaP" c.swapcase() kEbAp
[değiştir] title metodu
Hatırlarsanız, yukarıda bahsettiğimiz metotlardan biri olan "capitalize" bir karakter dizisinin yalnızca ilk harfini büyütüyordu. Bu "title" metodu ise bir karakter dizisi içindeki bütün kelimelerin ilk harflerini büyütüyor:
a = u"bin atlı akınlarda çocuklar gibi şendik. bin yaya dönüşte çok sinirliydik!" print a.title() Bin Atlı Akınlarda Çocuklar Gibi Şendik. Bin Yaya Dönüşte Çok Sinirliydik!
Burada karakter dizimizin başına neden bir "u" harfi koyduğumuzu artık biliyorsunuz. Tekrar açıklamaya gerek yok. Ayrıca bu karakter dizisini yazdırmadan önce, mevcut konsol oturumu içinde daha önce en az bir kez şu komutların verilmiş olması gerektiğini de biliyoruz:
import locale locale.setlocale(locale.LC_ALL,"")
[değiştir] center metodu
Bu metot, karakter dizilerinin sağında ve solunda, programcının belirlediği sayıda boşluk bırakarak karakter dizisini iki yana yaslar:
"a".center(15) ' a '
İstersek boşluk yerine, kendi belirlediğimiz bir karakteri de yerleştirebiliriz:
"a".center(3,"#") '#a#'
Gördüğünüz gibi, parantez içinde belirttiğimiz sayı bırakılacak boşluktan ziyade, bir karakter dizisinin ne kadar yer kaplayacağını gösteriyor. Yani mesela yukarıdaki örneği göz önüne alırsak, asıl karakter dizisi ("a") + 2 adet "#" işareti = 3 adet karakter dizisinin yerleştirildiğini görüyoruz. Eğer karakter dizimiz, tek harf yerine üç harften oluşsaydı, parantez içinde verdiğimiz üç sayısı hiç bir işe yaramayacaktı. Böyle bir durumda, "#" işaretini çıktıda gösterebilmek için parantez içinde en az 4 sayısını kullanmamız gerekirdi.
[değiştir] ljust metodu
Bu metot, karakter dizilerinin sağında boşluk bırakarak, karakter dizisinin sola yaslanmasını sağlar:
"a".ljust(15) 'a '
Tıpkı center metodunda olduğu gibi, bunun parametrelerini de istediğimiz gibi düzenleyebiliriz:
"a".ljust(3,"#") 'a##'
[değiştir] rjust metodu
Bu metot ise ljust'un tersidir. Yani karakter dizilerini sağa yaslar:
"a".rjust(3,"#") '##a'
[değiştir] zfill metodu
Yukarıda bahsettiğimiz ljust, rjust gibi metotlar yardımıyla karakter dizilerinin sağını-solunu istediğimiz karakterlerle doldurabiliyorduk. Bu zfill metodu yardımıyla da bir karakter dizisinin soluna istediğimiz sayıda "0" yerleştirebiliyoruz:
a = "8" a.zfill(4) 0008
zfill metodunun kullanımıyla ilgili şöyle bir örnek verebiliriz:
import time
while True:
for i in range(21):
time.sleep(1)
print str(i).zfill(2)
while i > 20:
continue
Bu kodlarla ilgili bir tartışma için şu adresi ziyaret edebilirsiniz:
[değiştir] replace metodu
Python'daki karakter dizisi metotları içinde belki de en çok işimize yarayacak metotlardan birisi de bu "replace" metodudur. "replace" kelimesi İngilizce'de "değiştirmek, yerine koymak" gibi anlamlara gelir. Dolayısıyla anlamından da anlaşılacağı gibi bu metot yardımıyla bir karakter dizisi içindeki karakterleri başka karakterlerle değiştiriyoruz. Metot şu formül üzerine işler:
karakter_dizisi.replace("eski_karakter","yeni_karakter")
Hemen bir örnek vererek durumu somutlaştıralım:
karakter = "Kahramanmaraşlı Abdullah"
print karakter.replace("a","o")
Kohromonmoroşlı Abdulloh
Gördüğünüz gibi, replace metodu yardımıyla karakter dizisi içindeki bütün "a" harflerini kaldırıp yerlerine "o" harfini koyduk. Burada normalde "print" deyimini kullanmasak da olur, ama karakter dizisi içinde Türkçe'ye özgü harfler olduğu için, eğer "print" deyimini kullanmazsak çıktıda bu harfler bozuk görünecektir.
Bu metodu, isterseniz bir karakteri silmek için de kullanabilirsiniz. O zaman şöyle bir şey yapmamız gerekir:
karakter = "Adanalı istihza"
karakter_dgs = karakter.replace("a","")
print karakter_dgs
Adnlı istihz
Burada bir karakteri silmek için içi boş bir karakter dizisi oluşturduğumuza dikkat edin.
replace metodunun, yukarıdaki formülde belirtmediğimiz üçüncü bir parametresi daha vardır. Dikkat ettiyseniz, yukarıdaki kod örneklerinde replace metodu karakter dizisi içindeki bir karakteri, dizi içinde geçtiği her yerde değiştiriyordu. Yani örneğin "a.replace("b","c")" dediğimizde, "a" değişkeninin sakladığı karakter dizisi içinde ne kadar "b" harfi varsa bunların hepsi "c"ye dönüşüyor. Bahsettiğimiz üçüncü parametre yardımıyla, karakter dizisi içinde geçen harflerin kaç tanesinin değiştirileceğini belirleyebiliyoruz:
karakter = "Adanalı istihza"
karakter_dgs = karakter.replace("a","",2)
print karakter_dgs
Adnlı istihza
Burada, "Adanalı istihza" karakter dizisi içinde geçen "a" harflerinden "2" tanesini siliyoruz.
"a" harfi ile "A" harfinin Python'un gözünde birbirlerinden farklı iki karakterler olduğunu unutmayın...
[değiştir] startswith metodu
Bu metot yardımıyla bir karakter dizisinin belirli bir harf veya karakterle başlayıp başlamadığını denetleyebiliyoruz. Örneğin:
a = "elma"
a.startswith("e")
True
b = "armut"
a.startswith("c")
False
Görüldüğü gibi eğer bir karakter dizisi parantez içinde belirtilen harf veya karakterle başlıyorsa, yani bir karakter dizisinin ilk harfi veya karakteri parantez içinde belirtilen harf veya karakterse "doğru" anlamına gelen "True" çıktısını; aksi halde ise "yanlış" anlamına gelen "False" çıktısını elde ediyoruz.
Bu metot sayesinde karakter dizilerini ilk harflerine göre sorgulayıp sonuca göre istediğimiz işlemleri yaptırabiliyoruz:
liste = ["elma","erik","ev","elbise","karpuz","armut","kebap"]
for i in liste:
if i.startswith("e"):
i.replace("e","i")
'ilma'
'irik'
'iv'
'ilbisi'
Sizin bu metodu kullanarak daha faydalı kodlar yazacağınıza inanıyorum...
[değiştir] endswith metodu
Bu metot, yukarıda anlattığımız startswith metodunun yaptığı işin tam tersini yapıyor. Hatırlarsanız startswith metodu ile, bir karakter dizisinin hangi harfle başladığını denetliyorduk. İşte bu endswith metodu ile ise karakter dizisinin hangi harfle bittiğini denetleyeceğiz. Kullanımı startswith metoduna çok benzer:
a = "elma"
a.endswith("a")
True
b = "armut"
a.endswith("a")
False
Bu metot yardımıyla, cümle sonlarında bulunan istemediğiniz karakterleri ayıklayabilirsiniz:
kd1 = "ekmek elden su gölden!"
kd2 = "sakla samanı gelir zamanı!"
kd3 = "karga karga gak dedi..."
kd4 = "Vay vicdansızlar..."
for i in kd1,kd2,kd3,kd4:
if i.endswith("!"):
print i.replace("!","")
ekmek elden su gölden
sakla samanı gelir zamanı
[değiştir] count metodu
"count" metodu bize bir karakter dizisi içinde bir karakterden kaç adet bulunduğunu denetleme imkanı verecek. Lafı uzatmadan bir örnek verelim:
besiktas = "Sinan Paşa Pasajı"
besiktas.count("a")
5
Demek ki "Sinan Paşa Pasajı" karakter dizisi içinde 5 adet "a" harfi varmış...
Şimdi bu metodun nerelerde kullanılabileceğine ilişkin bir örnek verelim. Bu örnekteki bazı noktaları henüz derslerimizde işlemedik. Dolayısıyla bazı kısımları anlayamazsanız dert etmeyin, zira ilerde bu konuların hepsine değineceğiz. Şimdilik aşağıdaki kodun anlayabildiğimiz kısmını anlamaya çalışıp, koddan elde ettiğimiz sonuca odaklanalım. Aşağıdaki çalışmayı komut satırına değil, bir metin düzenleyici yardımıyla dosyaya yazıyoruz:
#-*-coding:utf8-*-
#Türkçe karakterlerin düzgün görüntülenebilmesi için şu iki satırı ekleyelim...
import locale
locale.setlocale(locale.LC_ALL,"")
while True:
soru = raw_input("Bir karakter dizisi giriniz: ").replace(" ","") #replace metodu, karakterlerdeki boşlukları silmemizi sağlıyor.
karakter = list(unicode(soru)) #unicode'nin değişkenlerle birlikte kullanımına dikkat edin
liste = [i for i in karakter if karakter.count(i) > 1] #burada "liste üreteçleri"nden faydalanıyoruz. Bu konuya ilerde değineceğiz.
ortak = set(karakter) | set(liste) #Python'daki "set" fonksiyonu bize kısayoldan küme işlemleri yapma imkanı sağlıyor.
for i in ortak:
print "%s harfinden ==> %s tane"%(i, karakter.count(i))
Yukarıdaki çalışmada kullanıcıdan herhangi bir karakter dizisi girmesini istiyoruz. Kodlarımız bize, kullanıcının girdiği karakter dizisi içinde her bir harften kaç tane olduğunu söylüyor.
[değiştir] isalpha metodu
Bu metot yardımıyla bir karakter dizisinin "alfabetik" olup olmadığını denetleyeceğiz. Peki "alfabetik" ne demektir? Eğer bir karakter dizisi içinde yalnızca alfabe harfleri (a, b, c gibi...) varsa o karakter dizisi için "alfabetik" diyoruz. Bir örnekle bunu doğrulayalım:
a = "kezban" a.isalpha() True
Ama:
b = "k3zb6n" b.isalpha() False
[değiştir] isdigit metodu
Bu metot da isalpha metoduna benzer. Bunun yardımıyla bir karakter dizisinin "sayısal" olup olmadığını denetleyebiliriz. Sayılardan oluşan karakter dizilerine "sayı karakter dizileri" adı verilir. Örneğin şu bir "sayı karakter dizisi"dir:
a = "12345"
Metodumuz yardımıyla bunu doğrulayabiliriz:
a.isdigit() True
Ama şu karakter dizisi sayısal değildir:
b = "123445b"
Hemen kontrol edelim:
b.isdigit() False
[değiştir] isalnum metodu
Bu metot, bir karakter dizisinin "alfanümerik" olup olmadığını denetlememizi sağlar. Peki "alfanümerik" nedir?
Daha önce bahsettiğimiz metotlardan hatırlayacaksınız:
"Alfabetik" karakter dizileri, alfabe harflerinden oluşan karakter dizileridir.
"Sayısal" karakter dizileri, sayılardan oluşan karakter dizileridir.
"Alfanümerik" karakter dizileri ise bunun birleşimidir. Yani sayı ve harflerden oluşan karakter dizilerine alfanümerik karakter dizileri adı verilir. Örneğin şu karakter dizisi alfanümerik bir karakter dizisidir:
a = "123abc"
İsterseniz hemen bu yeni metodumuz yardımıyla bunu doğrulayalım:
a.isalnum() True
Eğer denetleme sonucunda "True" alıyorsak, o karakter dizisi alfanümeriktir. Bir de şuna bakalım:
b = "123abc>" b.isalnum() False
b değişkeninin tuttuğu karakter dizisinde alfanümerik karakterlerin yanısıra ("123abc"), alfanümerik olmayan bir karakter dizisi de bulunduğu için (">"), b.isalnum() şeklinde gösterdiğimiz denetlemenin sonucu "False" (yanlış) olarak görünecektir.
Dolayısıyla, bir karakter dizisi içinde en az bir adet alfanümerik olmayan bir karakter dizisi bulunursa (bizim örneğimizde "<"), o karakter dizisi alfanümerik olmayacaktır.
[değiştir] islower metodu
Bu metot, bize bir karakter dizisinin tamamının küçük harflerden oluşup oluşmadığını denetleme imkanı sağlayacak. Mesela:
kent = "istanbul" kent.islower() True
Demek ki "kent" değişkeninin değeri olan karakter dizisi tamamen küçük harflerden oluşuyormuş.
Aşağıdaki örnekler ise "False" (yanlış) çıktısı verecektir:
a = "İstanbul" a.lower() False b = "ADANA" b.lower() False
[değiştir] isupper metodu
Bu metot da islower metoduna benzer bir şekilde, karakter dizilerinin tamamının büyük harflerden oluşup oluşmadığını denetlememizi sağlayacak:
a = "ADANA" a.isupper() True
[değiştir] istitle metodu
Daha önce öğrendiğimiz metotlar arasında "title" adlı bir metot vardı. Bu metot yardımıyla tamamı küçük harflerden oluşan bir karakter dizisinin ilk harflerini büyütebiliyorduk. İşte şimdi öğreneceğimiz istitle metodu da bir karakter dizisinin ilk harflerinin büyük olup olmadığını kontrol etmemizi sağlayacak:
a = "Karakter Dizisi" a.istitle() True b = "karakter dizisi" b.istitle() False
Gördüğünüz gibi, eğer karakter dizisinin ilk harfleri büyükse bu metot True çıktısı; aksihalde "False" çıktısı veriyor.
Bir de şuna bakalım:
c = "Gün Bugündür" c.istitle() False
Sizce neden böyle oldu? Evet, tahmin ettiğiniz gibi, karakter dizisinin içinde Türkçe'ye özgü harfler olduğu için metodumuz yanlış sonuç verdi. Şimdi bunu düzeltmeyi öğreneceğiz. Ama önce isterseniz Türkçe karakterlerin bazen nasıl sonuçlar doğurabileceğine bir örnek verelim:
d = "gün bugündür" print d.title() GüN BugüNdüR
Gördüğünüz gibi Türkçe karakterler, "title" metodunun tamamen sapıtmasına, kısa devre yapmasına yol açtı!... Normalde title metodunun ne yapması gerektiğini biliyoruz:
e = "armut bir meyvedir" e.title() 'Armut Bir Meyvedir'
Yukarıda gördüğümüz, Türkçe karakterler barındıran örnekte ise title metodu karakter dizisi içindeki kimi harfleri büyüttü, kimi harfleri ise küçük bıraktı!...
Bu durumu nasıl düzelteceğimizi biliyorsunuz. Her oturumda en az bir kez şu komutları çalıştırmamız gerekiyor:
import locale locale.setlocale(locale.LC_ALL,"")
Bu komutları çalıştırdıktan sonra yukarıda gösterdiğimiz ve hata verdiğini gördüğümüz komutları tekrar çalıştırmayı deneyin. Bu defa metotların sorunsuz işlediğini göreceksiniz. Tabii ki Türkçe harfler içeren karakter dizilerimizi "unicode" olarak tanımlamayı unutmuyoruz.
[değiştir] isspace metodu
Bu metot ile, bir karakter dizisinin tamamen boşluk karakterlerinden oluşup oluşmadığını kontrol ediyoruz. Eğer bir karakter dizisi tamamen boşluk karakterinden oluşuyorsa, bu metot True çıktısı verecektir. Aksi halde, alacağımız çıktı False olacaktır:
a = " " a.isspace() True a = "selam!" a.isspace() False a = "" a.isspace() False
Son örnekten de gördüğümüz gibi, bu metodun True çıktısı verebilmesi için karakter dizisi içinde en az bir adet boşluk karakteri olması gerekiyor.
[değiştir] expandtabs metodu
Bu metot yardımıyla bir karakter dizisi içindeki sekme boşluklarını genişletebiliyoruz. Örneğin:
a = "elma\tbir\tmeyvedir" print a.expandtabs(10) elma bir meyvedir
[değiştir] find metodu
Bu metot, bir karakterin, karakter dizisi içinde hangi konumda yer aldığını söylüyor bize:
a = "armut"
a.find("a")
0
Bu metot karakter dizilerini soldan sağa doğru okur. Dolayısıyla eğer aradığımız karakter birden fazla sayıda bulunuyorsa, çıktıda yalnızca en soldaki karakter görünecektir:
b = "adana"
a.find("a")
0
Gördüğünüz gibi, find metodu yalnızca ilk "a" harfini gösterdi.
Eğer aradığımız karakter, o karakter dizisi içinde bulunmuyorsa, çıktıda "-1" sonucu görünecektir:
c = "mersin"
c.find("t")
-1
find metodu bize aynı zamanda bir karakter dizisinin belli noktalarında arama yapma imkanı da sunar. Bunun için şöyle bir sözdizimini kullanabiliriz:
"karakter_dizisi".find("aranacak_karakter",başlangın_noktası,bitiş_noktası)
Bir örnek verelim:
a = "adana"
Burada normal bir şekilde "a" harfini arayalım:
a.find("a")
0
Doğal olarak find metodu karakter dizisi içinde ilk bulduğu "a" harfinin konumunu söyleyecektir. Bizim örneğimizde "a" harfi kelimenin başında geçtiği için çıktıda "0" ifadesini görüyoruz. Demek ki bu karakter dizisi içinedeki ilk "a" harfi "0'ıncı" konumdaymış.
İstersek şöyle bir arama yöntemi de kullanabiliriz:
a.find("a",1,3)
Bu arama yöntemi şu sonucu verecektir:
2
Bu yöntemle, "a" harfini, karakter dizisinin 1 ve 3. konumlarında arıyoruz. Bu biçimin işleyişi, daha önceki derslerimizde gördüğümüz dilimleme işlemine benzer:
a[1:3] "da"
Bununla ilgili kendi kendinize bazı denemeler yaparak, işleyişi tam anlamıyla kavrayabilirsiniz.
[değiştir] rfind metodu
Bu metot yukarıda anlattığımız find metodu ile aynı işi yapar. Tek farklı karakter dizilerini sağdan sola doğru okumasıdır. Yukarıdaki find metodu karakter dizilerini soldan sağa doğru okur... Mesela:
a = "adana"
a.find("a")
0
a.rfind("a")
4
Gördüğünüz gibi, rfind metodu karakter dizisini sağdan sola doğru okuduğu için öncelikle en sondaki "a" harfini döndürdü.
[değiştir] index metodu
index metodu yukarıda anlattığımız find metoduna çok benzer. İki metot da aynı işi yapar:
a = "istanbul"
a.index("t")
2
Bu metot da bize, tıpkı find metodunda olduğu gibi, konuma göre arama olanağı sunar:
b = "kahramanmaraş"
b.index("a",8,10)
9
Demek ki, "b" değişkeninin tuttuğu karakter dizisinin 8 ve 10 numaralı konumları arasında "a" harfi 9. sırada yer alıyormuş....
Peki bu index metodunun find metodundan farkı nedir?
Hatırlarsanız find metodu aradığımız karakteri bulamadığı zaman "-1" sonucunu veriyordu. index metodu ise aranan karakteri bulamadığı zaman bir hata mesajı gösterir bize. Örneğin:
c = "istanbul"
c.index("m")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: substring not found
[değiştir] rindex metodu
rindex metodu da index metodu ile aynıdır. Farkları, rindex metodunun karakter dizisini sağdan sola doğru; index metodunun ise soldan sağa doğru okumasıdır:
c = "adana"
c.index("a")
0
c.rindex("a")
4
[değiştir] join metodu
Bu metodu açıklamak biraz zor ve kafa karıştırıcı olabilir. O yüzden açıklama yerine doğrudan bir örnekle, bu metodun ne işe yaradığını göstermeye çalışalım:
Şöyle bir karakter dizimiz olsun:
a = "Linux"
Şimdi şöyle bir işlem yapalım:
".".join(a)
Elde edeceğimiz çıktı şöyle olur:
L.i.n.u.x
Sanırım burada join metodunun ne iş yaptığını anladınız. "Linux" karakter dizisi içindeki bütün karakterlerin arasına birer tane "." (nokta) koydu. Tabii ki, nokta yerine başka karakterler de kullanabiliriz:
"*".join(a) L*i*n*u*x
Dikkat ederseniz join metodunun sözdizimi öteki metotlarınkinden biraz farklı. join metodunda parantez içine doğrudan değişkenin kendisi yazdık. Yani a.join("*") gibi bir şey yazmıyoruz.
Bu metot yardımıyla ayrıca listeleri de etkili bir biçimde karakter dizisine çevirebiliriz. Mesela elimizde şöyle bir liste olsun:
a = ["python", "php", "perl", "C++", "Java"]
Bu listenin öğelerini karakter dizileri halinde ve belli bir ölçüte göre sıralamak için şu kodu kullanıyoruz:
"; ".join(a) python; php; perl; C++; Java
İstersek bu kodu bir değişken içinde depolayıp kalıcı hale de getirebiliriz:
b = "; ".join(a) print b python; php; perl; C++; Java
En baştaki "a" adlı liste de böylece bozulmadan kalmış olur:
print a ['python', 'php', 'perl', 'C++', 'Java']
[değiştir] translate metodu
Bu metot, karakter dizisi metotları içindeki en karmaşık metotlardan birisi olmakla birlikte, zor işleri halletmekte kullanılabilecek olması açısından da bir hayli faydalı bir metottur.
translate metodu yardımıyla mesela şifreli mesajları çözebiliriz!.. Yalnız bu metodu "string" modülündeki "maketrans" adlı fonksiyonla birlikte kullanacağız. Bir örnek verelim:
Elimizde şöyle bir karakter dizisi olsun:
"tbyksr çsn jücho elu gloglu"
Bu şifreli mesajı çözmek için de şöyle bir ipucumuz var diyelim:
t ==> p s ==> o m ==> j
Elimizdeki ipucuna göre şifreli mesajdaki "t" harfinin karşılığı "p" olacak. Alfabetik olarak düşünürsek;
"t" harfi, "p" harfine göre, 5 harf geride kalıyor (p, r, s, ş, t) "s" harfi "o" harfine göre 5 harf geride kalıyor (o, ö, p, r, s) "j" harfi "m" harfine göre 4 harf geride kalıyor (j, k, l, m)
Bu çıkarımın bizi bir yere götürmeyeceği açık. Çünkü harfler arasında ortak bir ilişki bulamadık. Peki ya alfabedeki Türkçe karakterleri yok sayarsak? Bir de öyle deneyelim:
"t" harfi, "p" harfine göre, 4 harf geride kalıyor (p, r, s, t) "s" harfi "o" harfine göre 4 harf geride kalıyor (o, p, r, s) "j" harfi "m" harfine göre 4 harf geride kalıyor (j, k, l, m)
Böylece karakterler arasındaki ilişkiyi tespit etmiş olduk. Şimdi hemen bir metin düzenleyici açıp kodlarımızı yazmaya başlayabiliriz:
#-*-coding:utf8-*-
Bu satırı açıklamaya gerek yok. Ne olduğunu biliyoruz.
import string
Python modülleri arasından "string" modülünü içe aktarıyoruz (import)
metin = "tbyksr çsn jücho elu gloglu"
Şifreli metnimizi bir değişkene atayarak sabitliyoruz.
kaynak= "defghijklmnoprstuvyzabc" hedef = "abcdefghijklmnoprstuvyz"
Burada "kaynak", şifreli metnin yapısını; "hedef" ise alfabenin normal yapısını temsil ediyor. "kaynak" adlı değişkende "d" harfinden başlamamızın nedeni yukarıda keşfettiğimiz harfler-arası ilişkidir. Dikkat ederseniz, "hedef"teki harfleri, "kaynak"taki harflere göre, her bir harf dört sıra geride kalacak şekilde yazdık. (d -> a, e ->b, gibi...) Dikkat edeceğimiz bir başka nokta ise bunları yazarken Türkçe karakter kullanmamamız gerektiğidir.
cevir = string.maketrans(kaynak,hedef)
Burada ise, yukarıda tanımladığımız harf kümeleri arasında bir çevrim işlemi başlatabilmek için "string" modülünün "maketrans" adlı fonksiyonundan yararlanıyoruz. Bu komut, parantez içinde gösterdiğimiz kaynak değişkenini hedef değişkenine çeviriyor; aslında bu iki harf kümesi arasında bir ilişki kuruyor. Bu işlem sonucunda kaynak ve hedef değişkenleri arasındaki ilişkiyi gösteren bir formül elde etmiş olacağız.
soncevir = metin.translate(cevir)
Bu komut yardımıyla, yukarıda "cevir" olarak belirlediğimiz formülü, "metin" adlı karakter dizisine uyguluyoruz.
print soncevir
Bu komutla da son darbeyi vuruyoruz.
Şimdi bu komutlara topluca bir bakalım:
#-*-coding:utf8-*- import string metin = "tbyksr çsn jücho elu gloglu" kaynak= "defghijklmnoprstuvyzabc" hedef = "abcdefghijklmnoprstuvyz" cevir = string.maketrans(kaynak,hedef) soncevir = metin.translate(cevir) print soncevir
Bu programı komut satırından çalıştırdığınızda ne elde ettiniz?
[değiştir] partition metodu
Bu metot yardımıyla bir karakter dizisini belli bir ölçüte göre üçe bölüyoruz. Örneğin:
a = "istanbul"
a.partition("an")
('ist', 'an', 'bul')
Eğer partition metoduna parantez içinde verdiğimiz ölçüt karakter dizisi içinde bulunmuyorsa şu sonuçla karşılaşırız:
a = "istanbul"
a.partition("h")
('istanbul', '', '')
[değiştir] rpartition metodu
Bu metot da partition metodu ile aynı işi yapar, ama yöntemi biraz farklıdır. partition metodu karakter dizilerini soldan sağa doğru okur. rpartition metodu ise sağdan sola doğru.. Peki bu durumun ne gibi bir sonucu vardır? Hemen görelim:
b = "istihza"
b.partition("i")
('', 'i', 'stihza')
Gördüğünüz gibi, partition metodu karakter dizisini ilk "i" harfinden böldü. Şimdi aynı işlemi rpartition metodu ile yapalım:
b.rpartition("i")
('ist', 'i', 'hza')
rpartition metodu ise, karakter dizisini sağdan sola doğru okuduğu için ilk "i" harfinden değil, son "i" harfinden böldü karakter dizisini...
partition ve rpartition metotları, ölçütün karakter dizisi içinde bulunmadığı durumlarda da farklı tepkiler verir:
b.partition("g")
('istihza', '', '')
b.rpartition("g")
('', '', 'istihza')
Gördüğünüz gibi, partition metodu boş karakter dizilerini sağa doğru yaslarken, rpartition metodu sola doğru yasladı.
[değiştir] strip metodu
Bu metot bir karakter dizisinin başında (solunda) ve sonunda (sağında) yer alan boşluk ve yeni satır (\n) gibi karakterleri siler.
a = " boşluk " a.strip() 'boşluk' b = "boşluk\n" b.strip() 'boşluk'
[değiştir] rstrip metodu
Bu metot bir karakter dizisinin sadece sonunda (sağında) yer alan boşluk ve yeni satır (\n) gibi karakterleri siler.
a = "boşluk " a.rstrip() 'boşluk' b = "boşluk\n" b.rstrip() 'boşluk'
[değiştir] lstrip metodu
Bu metot bir karakter dizisinin sadece başında (solunda) yer alan boşluk ve yeni satır (\n) gibi karakterleri siler.
a = "boşluk " a.rstrip() 'boşluk' b = "boşluk\n" b.rstrip() 'boşluk'
[değiştir] splitlines metodu
Bu metot yardımıyla, bir karakter dizisini satır kesme noktalarından bölerek, bölünen öğeleri liste haline getirebiliyoruz.
satir = "Adana'nın yolları taştan\nSen çıkardın beni baştan" print satir.splitlines() ["Adana'nın yolları taştan", 'Sen çıkardın beni baştan']
[değiştir] split metodu
Bu metot biraz join metodunun yaptığı işi tersine çevirmeye benzer. Hatırlarsanız join metodu yardımıyla bir listenin öğelerini etkili bir şekilde karakter dizisi halinde sıralayabiliyorduk:
a = ["Debian", "Pardus", "Ubuntu", "SuSe"] b = ", ".join(a) print b Debian, Pardus, Ubuntu, SuSe
İşte split metoduyla bu işlemi tersine çevirebiliriz:
yeni = b.split(",")
print yeni
['Debian', ' Pardus', ' Ubuntu', ' SuSe']
Böylece her karakter dizisi farklı bir liste öğesi haline geldi:
yeni[0] 'Debian' yeni[1] 'Pardus' yeni[2] 'Ubuntu' yeni[3] 'SuSe'
Bu metotta ayrıca isterseniz ölçütün yanısıra ikinci bir parametre daha kullanabilirsiniz:
c = b.split(",", 1)
print c
['Debian', ' Pardus, Ubuntu, SuSe']
Gördüğünüz gibi, parantez içinde "," ölçütünün yanına bir adet "1" sayısı koyduk. Çıktıyı dikkatle incelediğimizde split metodunun bu parametre yardımıyla karakter dizisi içinde sadece bir adet bölme işlemi yaptığını görüyoruz. Yani oluşan listenin bir öğesi "Debian", öteki öğesi de "Pardus, Ubuntu, SuSe" oldu. Bunu şu şekilde daha açık görebiliriz:
c[0] 'Debian' c[1] ' Pardus, Ubuntu, SuSe'
Gördüğünüz gibi listenin 0. öğesi Debian'ken; listenin 1. öğesi "Pardus, Ubuntu, Suse" üçlüsü. Yani bu üçlü tek bir karakter dizisi şeklinde tanımlanmış.
Yukarıda tanımladığımız "yeni" adlı listeyle "c" adlı listenin uzunluklarını karşılaştırarak durumu daha net görebiliriz:
len(yeni) 4 len(c) 2
Parantez içindeki "1" parametresini değiştirerek kendi kendine denemeler yapmanız metodu daha iyi anlamanıza yardımcı olacaktır.
[değiştir] rsplit metodu
Bu metot yukarıda anlattığımız split metoduna çok benzer. Hatta tamamen aynı işi yapar. Tek bir farkla: split metodu karakter dizilerini soldan sağa doğru okurken; rsplit metodu sağdan sola doğru okur. Önce şöyle bir örnek verip bu iki metodun birbirine ne kadar benzediğini görelim:
a = "www.python.quotaless.com"
a.split(".")
['www', 'python', 'quotaless', 'com']
a.rsplit(".")
['www', 'python', 'quotaless', 'com']
Bu örnekte ikisi arasındaki fark pek belli olmasa da, split metodu soldan sağa doğru okurken, rsplit metodu sağdan sola doğru okuyor. Daha açık bir örnek verelim:
orneksplit = a.split(".", 1)
print orneksplit
['www', 'python.quotaless.com']
ornekrsplit = a.rsplit(".", 1)
print ornekrsplit
['www.python.quotaless', 'com']
Sanırım bu şekilde ikisi arasındaki fark daha belirgin oldu. Öyle değil diyorsanız bir de şuna bakın:
orneksplit[0] 'www' ornekrsplit[0] 'www.python.quotaless'
Böylece Karakter Dizisi Metotlarını bitirmiş olduk. Dikkat ederseniz metot listesi içindeki iki metodu anlatmadık. Bunlar, encode ve decode metotları... Bunları "Python'da Unicode" konusunu işlerken anlatmak üzere şimdilik bir kenara bırakıyoruz.
Bu konuyu iyice sindirebilmek için kendi kendinize bolca örnek ve denemeler yapmanızı, bu konuyu arada sırada tekrar etmenizi öneririm.
Önceki Bölüm: Hatalarla Başetme
Sonraki Bölüm: Tkinter'le Arayüz Programlama - Temel Bilgiler
Bu yazı Programlama bölümünün bir parçasıdır.
