13. Karakter Dizilerinin Metotları¶
Bu bölümde, önceki derslerde öğrenmiş olduğumuz bir konu olan “Karakter Dizileri”nden söz edeceğiz. Dediğim gibi, aslında biz karakter dizisinin ne olduğunu biliyoruz. Çok kaba bir şekilde ifade etmek gerekirse, karakter dizileri, adından da anlaşılacağı gibi, karakterlerin bir araya gelmesiyle oluşan bir dizidir. Karakter dizileri, tırnak (tek, çift veya üç tırnak) içinde gösterilen ve öteki veri tiplerinden bu tırnaklar aracılığıyla ayırt edilen özel bir veri tipidir. Mesela şu örneklerin birer karakter dizisi olduğunu biliyoruz:
>>> kardiz1 = "çift tırnaklı karakter dizisi"
>>> kardiz2 = 'tek tırnaklı karakter dizisi'
>>> kardiz3 = """üç tırnaklı karakter dizisi"""
Biz karakter dizilerini bundan önceki bölümlerde de bolca kullanmıştık. Dolayısıyla bu veri tipinin ne olduğu konusunda bir sıkıntımız yok. Bu bölümde, şimdiye kadar karakter dizileri ile ilgili öğrendiğimiz şeylere ek olarak, karakter dizilerin metotlarından söz edeceğiz. Aslında biz “metot” kavramının da ne olduğunu biliyoruz. Metotlar Python’da bir karakter dizisinin, bir sayının, bir listenin veya sözlüğün niteliklerini kolaylıkla değiştirmemizi veya bu veri tiplerine yeni özellikler katmamızı sağlayan küçük parçacıklardır. Örneğin listeler konusunu işlerken sözünü ettiğimiz append(), listelerin bir metodudur. Daha önce listeleri, sözlükleri, demetleri ve kümeleri işlerken nasıl bu veri tiplerinin bazı metotları olduğundan bahsettiysek, bu bölümde de karakter dizilerinin metotlarından bahsedeceğiz. Ancak bu bölümde bahsedeceğimiz tek şey karakter dizilerinin metotları olmayacak. Bu bölümde aynı zamanda karakter dizilerinin yapısı ve özelliklerine ilişkin söyleyeceklerimiz de olacak...
İlk iş olarak isterseniz karakter dizilerinin hangi metotları olduğunu görelim:
>>> dir("")
...
['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__',
'__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__',
'__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__',
'__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__',
'__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__',
'__subclasshook__', '_formatter_field_name_split', '_formatter_parser',
'capitalize', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find',
'format', 'index', 'isalnum', 'isalpha', 'isdecimal', 'isdigit', 'isidentifier',
'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join',
'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind',
'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines',
'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
Gördüğünüz gibi karakter dizilerinin çok sayıda metodu var. Zaten daha önce de dediğimiz gibi, karakter dizileri Python programlama dilinin en güçlü olduğu veri tiplerinden bir tanesidir.
Biz bu bölümde, yukarıdaki liste içinde görünen metotlar arasında, içinde “_” işareti barındırmayanları inceleyeceğiz. Yani şunları:
>>> for i in dir(""):
... if "_" not in i:
... print(i)
...
capitalize
center
count
encode
endswith
expandtabs
find
format
index
isalnum
isalpha
isdecimal
isdigit
isidentifier
islower
isnumeric
isprintable
isspace
istitle
isupper
join
ljust
lower
lstrip
maketrans
partition
replace
rfind
rindex
rjust
rpartition
rsplit
rstrip
split
splitlines
startswith
strip
swapcase
title
translate
upper
zfill
Bu metotları karışık olarak inceleyeceğiz ilerleyen sayfalarda... Gelin isterseniz sözü daha fazla uzatmadan ilk metodumuzla başlayalım işe...
13.1. startswith Metodu¶
Bu bölümde inceleyeceğimiz ilk metodumuz startswith(). Bu metot, bize bir karakter dizisinin belli bir karakterle başlayıp başlamadığını söyler. Hemen bir örnek verelim:
>>> kardiz = "elveda zalim dünya!"
>>> kardiz.startswith("e")
True
Burada “elveda zalim dünya!” karakter dizisi “e” harfiyle başladığı için startswith() metodu True çıktısı veriyor. Bir de şuna bakalım:
>>> kardiz.startswith("i")
False
“elveda zalim dünya!” karakter dizisi “i” harfiyle başlamadığı için metodumuz bize False çıktısı verdi. Eğer startswith() diye bir metot olmasaydı yukarıdaki örnekleri şöyle yazmamız gerekecekti:
>>> kardiz[0] == "e"
True
>>> kardiz[0] == "i"
False
Bu örnekten de anladığımıza göre, tıpkı listelerde olduğu gibi karakter dizilerinde de, öğelerin sırasını belirterek bu öğelere tek tek erişebiliyoruz. Örneğin:
>>> kardiz = "python"
>>> kardiz[0] #karakter dizisinin ilk öğesini alıyoruz...
'p'
>>> kardiz[-1] #karakter dizisinin son öğesini alıyoruz...
'n'
>>> len(kardiz) #karakter dizisinin uzunluğunu ölçelim...
6
13.2. endswith Metodu¶
Sıradaki metodumuz endswith(). Bu metot yukarıda incelediğimiz startswith() metodunun yaptığı işin tam tersini yapar. O metot bir karakter dizisinin belli bir harfle başlayıp başlamadığını söylüyordu, bu metot ise bize bir karakter dizisinin belli bir karakterle bitip bitmediğini söyler:
>>> kardiz = "elveda zalim dünya!"
>>> kardiz.endswith("!")
True
Gördüğünüz gibi, karakter dizimiz ”!” karakteriyle bittiği için yukarıdaki koddan True çıktısı aldık. Eğer karakter dizimiz ”!” karakteriyle bitmeseydi False çıktısı alacaktık.
endswith() diye bir metot olmasaydı, aynı işlevi şöyle de yerine getirebilirdik:
>>> kardiz = "elveda zalim dünya!"
>>> kardiz[-1] == ("!")
True
13.3. islower Metodu¶
Bu metot bir karakter dizisinin tamamen küçük harflerden oluşup olmadığını denetler. Mesela:
>>> kardiz = "elif dedim be dedim"
>>> kardiz.islower()
True
Burada bütün karakterler küçük harfli olduğu için islower() metodu True çıktısı veriyor. Eğer karakter dizimizin içinde tek bir büyük harf dahi olsa bu metot False çıktısı verecektir:
>>> kardiz = "Elif dedim be dedim"
>>> kardiz.islower()
False
13.4. isupper Metodu¶
Bu metot ise, islower() metodunun yaptığı işin tam tersini yapar. Bu metot ile bir karakter dizisinin tamamen büyük harflerden oluşup oluşmadığını denetleyebiliriz:
>>> kardiz = "ELİF DEDİM BE DEDİM"
>>> kardiz.isupper()
True
Bu metot da, tıpkı islower() metodunda olduğu gibi, eğer karakter dizisinin içinde tek bir küçük harf varsa dahi False çıktısı verecektir...
13.5. replace Metodu¶
Bu metot, karakter dizisi metotları içinde en yararlı ve en çok kullanılan metotlardan biridir. Normal şartlar altında zorlukla halledebileceğimiz işlerin altından bu metot yardımıyla çok kolay bir şekilde kalkabiliriz. replace() metodu bir karakter dizisi içindeki karakterleri başka karakterlerle değiştirmemize olanak tanır:
>>> kardiz = "elma"
>>> kardiz.replace("e", "a")
'alma'
Gördüğünüz gibi, “elma” karakter dizisi içindeki “e” harfini “a” harfine dönüştürdük. Ancak burada önemli bir ayrıntıya dikkatinizi çekmek isterim. Hatırlarsanız karakter dizilerinden ilk kez bahsettiğimiz bölümde, karakter dizilerinin “değiştirilemeyen” (immutable) veri tipleri olduğunu söylemiştik. Bu özellik burada da karşımıza çıkıyor. Mesela yukarıdaki örnekte “elma” karakter dizisi üzerinde değişiklik yapmış gibi görünsek de, aslında karakter dizisinde herhangi bir değişiklik olmadı. Bunu şu şekilde test edebiliriz:
>>> print(kardiz)
'elma'
Gördüğünüz gibi, karakter dizimiz, replace() metoduyla “e” harfini “a” harfine dönüştürmüş olmamıza rağmen olduğu gibi duruyor. İşte bunun nedeni karakter dizilerinin değiştirilemeyen bir yapıda olmasıdır. Elbette bu kısıtlamayı da aşmanın bir yolu var:
>>> kardiz = kardiz.replace("e", "a")
>>> print(kardiz)
'alma'
Burada yaptığımız şey, yeni verileri “kardiz” adlı karakter dizisinin üzerine yazmaktan ibarettir... Yani biz burada “kardiz”in değiştirilmiş halini tekrar “kardiz”in kendisine atıyoruz. Böylece sonuç olarak karakter dizimiz üzerinde değişiklik yapmış oluyoruz. Karakter dizilerinin değiştirilemez oluşu oldukça önemli bir konudur. Yazdığımız kodların beklediğimiz şekilde çalışabilmesi için karakter dizilerinin bu özelliğini mutlaka göz önünde bulundurmamız gerekir.
Sizlere kolaylık olması açısından bu replace() metodunun formülünü de verelim:
karakter_dizisi.replace(eski_karakter, yeni_karakter)
Bu formüle göre, parantez içinde ilk sırada kendisini değiştireceğimiz karakteri belirtiyoruz. İkinci sırada ise değiştireceğimiz karakterin yerine gelecek yeni karakteri yazıyoruz.
replace() metodu yukarıdakilerin dışında üçüncü bir argüman daha alır. Bunu bir örnek üzerinden görelim:
>>> kardiz = "katar"
>>> kardiz.replace("a", "ı", 2)
'kıtır'
replace() metoduna verdiğimiz üçüncü argüman, belirtilen karakterin kaç yerde değiştirileceğini gösteriyor. Yukarıdaki örneğe göre biz “katar” adlı karakter dizisi içinde geçen 2 adet “a” harfini “ı” harfiyle değiştirmek istiyoruz. Eğer bu üçüncü argümanı belirtmezsek, replace() metodu bulduğu bütün “a” harflerini değiştirecektir:
>>> kardiz = "dal kalkar kartal sarkar, kartal kalkar dal sarkar"
>>> kardiz.replace("a", "@")
'd@l k@lk@r k@rt@l s@rk@r, k@rt@l s@rk@r d@l k@lk@r'
13.6. join Metodu¶
Tıpkı replace() metodu gibi, join() metodu da en çok kullanılan ve en işe yarar karakter dizisi metotlarından biridir. “join” kelimesi Türkçe’de birleştirmek anlamına gelir. Bu metodun görevi birden fazla karakter dizisini tek bir karakter dizisi haline getirmektir. Bu metodu, örneğin, karakter dizilerinden oluşmuş bir listeyi tek bir karakter dizisi haline getirmek için kullanabiliriz:
>>> liste = ["bugün", "günlerden", "pazar"]
>>> " ".join(liste)
'bugün günlerden pazar'
Gördüğünüz gibi, bu metodun kullanımı öteki metotlardan biraz farklı gibi görünüyor. Ama aslında ötekilerden pek bir farkı yoktur. Metodu nasıl kullandığımıza dikkat edin. Sanırım şöyle bir örnek daha verirsek bazı noktaları birazcık aydınlatmış oluruz:
>>> ", ".join(liste)
'bugün, günlerden, pazar'
Bu örnekten de anladığımız gibi, join() metodu listedeki bütün karakter dizilerini alıyor, her bir karakter dizisinin arasına ”,” işaretini yerleştiriyor ve bu karakter dizilerini tek bir karakter dizisi olarak birleştiriyor.
Hatırlarsanız Genel Tekrar bölümünde bu join() metoduyla ilgili olarak şöyle bir örnek vermiştik:
>>> liste = ["elma", "armut", "kebap"]
>>> print(", ".join(liste))
elma, armut, kebap
Artık bu örneğin nasıl çalıştığını anlayabiliyoruz. Burada listemizin bütün öğelerini alıp her bir öğeyi tek bir karakter dizisi halinde birleştirdik. Bu öğeleri birleştirirken de her bir öğenin arasına bir ”,” işareti koyduk... Elbette eğer istersek biz bu öğeleri istediğimiz başka bir işaretle de birleştirebiliriz. Mesela:
>>> liste = ["elma", "armut", "kebap"]
>>> print(" -- ".join(liste))
elma -- armut -- kebap
Bu arada, bu join() metodunun sadece karakter dizileri üzerinde işlediğini unutmuyoruz. Dolayısıyla, içinde karakter dizisi dışında bir veri tipi barındıran listeleri bu metotla birleştirmeye kalkarsak hata alırız:
>>> liste = [1, 2, "elma"]
>>> " -- ".join(liste)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: sequence item 0: expected str instance, int found
13.7. split Metodu¶
Bu metot, temel olarak join() metodunun tam tersi bir vazife görür. split() metodunu kullanarak, bir karakter dizisinin içindeki öğeleri liste haline getirebiliriz:
>>> kardiz = "güzel günler göreceğiz"
>>> kardiz.split()
['güzel', 'günler', 'göreceğiz']
Eğer karakter dizisinin tamamını tek bir liste halinde almak isterseniz şöyle bir kod kullanabilirsiniz:
>>> kardiz.split(",")
['güzel günler göreceğiz']
Elbette, split() metoduna argüman olarak yalnızca virgül (”,”) vermek zorunda değiliz:
>>> kardiz.split("g")
['', 'üzel ', 'ünler ', 'öreceğiz']
Şöyle bir örnek daha vererek bu metot hakkındaki bilgimizi pekiştirelim:
>>> site = "www.istihza.com"
>>> site.split(".")
['www', 'istihza', 'com']
Burada “site” adlı karakter dizimizi, içindeki nokta işaretlerinden böldük.
split() metodu ek olarak bir parametre daha alır. Bu parametre bir sayıdır ve karakter dizisi üzerine kaç kez bölme işlemi uygulanacağını gösterir:
>>> site.split(".", 1)
['www', 'istihza.com']
Burada metodumuz, “site” adlı karakter dizisi üzerine sadece 1 kez bölme işlemi uyguladı. Buna göre, “www” kısmını böldükten sonra geri kalan kısmı tek bir öğe olarak liste içine dahil etti.
13.8. 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:
>>> site = "www.istihza.com"
>>> site.split(".")
['www', 'istihza', 'com']
>>> site.rsplit(".")
['www', 'istihza', 'com']
Bu örnekte ikisi arasındaki fark pek belli olmasa da, aslında split() metodu karakter dizisini soldan sağa doğru okurken, rsplit() metodu sağdan sola doğru okuyor. Şimdi daha açık bir örnek verelim:
>>> site.split(".", 1)
['www', 'istihza.com']
Yukarıdaki örnek, split() metodunun davranışını gösteriyor. Şimdi şuna bakalım:
>>> site.rsplit(".", 1)
['www.istihza', 'com']
Gördüğünüz gibi, rstrip() metodu karakter dizisini sağdan sola doğru okuyup, tek bir bölme işlemi yaparak, sitenin “com” kısmını tek başına, “www.istihza” kısmını ise birlikte tek bir öğe olarak liste haline getirdi...
13.9. strip Metodu¶
strip(), karakter dizilerinin metotları arasında en ilginçlerinden biridir... Bu metodun, parametreli veya parametresiz verilişine bağlı olarak farklı görevleri vardır.
Bu metot parametresiz olarak kullanıldığında, bir karakter dizisinin başındaki ve sonundaki boşluk karakterlerini ve kaçış dizilerini kırpar. Örnek üzerinde görelim:
>>> kardiz = "\nVicdansız Sabuha\t"
>>> kardiz.strip()
'Vicdansız Sabuha'
Gördüğünüz gibi, bu metot yukarıdaki karakter dizisinin başındaki ve sonundaki “\n” ve “\t” kaçış dizilerini kırptı. Bu metot aynı zamanda baştaki ve sondaki boşlukları da siler:
>>> kardiz = " Vicdansız Sabuha "
>>> kardiz.strip()
'Vicdansız Sabuha'
Eğer bu metodu bazı parametrelerle kullanırsak daha farklı bir sonuç elde ederiz:
>>> kardiz = "Vicdansız Sabuha"
>>> kardiz.strip("ha")
'Vicdansız Sabu'
Burada strip() metodu, karakter dizimizin en sonunda yer alan “ha” harflerini sildi. Eğer bu karakter dizisinin başında da “ha” harfleri olsaydı onlar da gidecekti...
>>> kardiz = "hayırsız Sabuha"
>>> kardiz.strip("ha")
'yırsız Sabu'
Bu metot, kendisine parametre olarak verilen karakterlerin sırasını önemsemez. Yani şöyle bir şey de yazsanız baştaki ve sondaki “ha” harfleri uçacaktır:
>>> kardiz.strip("ah")
'yırsız Sabu'
Hatta şöyle bir şey dahi mümkündür:
>>> kardiz.strip("ahyı")
'rsız Sabu'
Burada strip() metodu karakter dizisinin başında ve sonunda gördüğü “a”, “h”, “y” ve “ı” harflerini kırptı.
Bu metotla ilgili şöyle bir kullanım örneği verebiliriz:
>>> liste = ["çilek", "şeker", "üzüm", "ısırgan", "ödül", "kitap", "defter",
... "soru"]
>>> for i in liste:
... i.strip("çşöüı")
...
'ilek'
'eker'
'züm'
'sırgan'
'dül'
'kitap'
'defter'
'soru'
Burada, bir liste içinde geçen kelimelerin başındaki ve sonundaki Türkçe harfleri kırptık. Başında ve sonunda Türkçe harfler içermeyen kelimeler bu kodlardan etkilenmedi...
13.10. lstrip Metodu¶
strip() metodunu anlatırken bu metodun bir karakter dizisinin başına ve sonuna etki ettiğini görmüştük. Eğer istediğimiz şey karakter dizisinin sadece başında yer alan bazı karakterleri kırpmaksa lstrip() metodundan yararlanacağız.
Hatırlarsanız strip() metodunda şöyle bir örnek vermiştik:
>>> kardiz = "hayırsız Sabuha"
>>> kardiz.strip("ha")
'yırsız Sabu'
Bu örnekte doğal olarak strip() metodu karakter dizisinin her iki tarafını da kırpıyordu. Şimdi aynı örneği lstrip() ile yapalım:
>>> kardiz == "hayırsız Sabuha"
>>> kardiz.lstrip("ha")
'yırsız Sabuha'
Gördüğünüz gibi, lstrip() metodu karakter dizisinin sadece baş tarafıyla ilgilendi, son kısma hiç dokunmadı.
13.11. rstrip Metodu¶
rstrip() metodu yukarıda gördüğümüz lstrip() metodunun tersidir. Bu metot, bir karakter dizisinin sadece son tarafıyla ilgilenir:
>>> kardiz = "hayırsız Sabuha"
>>> kardiz.rstrip("ha")
'hayırsız Sabu'
Gördüğünüz gibi, lstrip() metodunun aksine rstrip() metodu karakter dizisinin sadece son tarafıyla ilgilendi, baş tarafa hiç ilişmedi.
13.12. upper Metodu¶
Sırada upper() adlı bir metot var. Bu metot yardımıyla bir karakter dizisi içindeki bütün harfleri büyütebileceğiz:
>>> kardiz = "merhaba dünya!"
>>> kardiz.upper()
'MERHABA DÜNYA'
13.13. lower Metodu¶
lower() metodu upper() metodunun yaptığı işin tam tersini yapar. Yani büyük olan harfleri küçültür:
>>> kardiz = "MERHABA DÜNYA!"
>>> kardiz.lower()
'merhaba dünya!'
13.14. capitalize Metodu¶
Yeni metodumuz capitalize(). Bu metodun görevi bir karakter dizisinin ilk harfini büyütmektir. Bunu şöyle kullanıyoruz:
>>> kardiz = "lahanayı yerken kıtır kıtır, sapına gelince meee!"
>>> kardiz.capitalize()
'Lahanayı yerken kıtır kıtır, sapına gelince meee!'
Gördüğünüz gibi, karakter dizimizin yalnızca ilk harfini büyüttü bu capitalize() adlı metot... Bu metodu (ve tabii ki öteki bütün metotları) istersek doğrudan karakter dizisinin üzerine de uygulayabiliriz:
>>> "çilek".capitalize()
'Çilek'
Bu arada, gördüğünüz gibi bu metot Türkçe harfleri büyütmekte zorlanmadı. Ancak bunun bir istisnası vardır. Bu metodun (ve birkaç başka metodun) anlaşamadığı tek bir Türkçe harf bulunur: “i” harfi. Sorunu kendi gözlerinizle görün:
>>> a = "işletim sistemi"
>>> a.capitalize()
'Işletim sistemi'
Buradaki sorun, “i” harfinin büyütülürken noktasını kaybetmesi... Ne yazık ki doğrudan Python’dan kaynaklanmayan bir sorun nedeniyle “i” harfini “İ” şeklinde büyütemiyoruz. Ancak endişe etmeyin. Bu “i” harfini doğrudan büyütemeyecek olsanız da, karşı karşıya olduğunuz duruma göre özel çözümler üreterek yolunuza devam edebilirsiniz. Basit bir örnek vereyim:
def tr_capitalize(kardiz):
"""Bir karakter dizisinin sadece ilk harfini büyütür."""
if kardiz.startswith("i"):
kardiz = kardiz[0].replace("i", "İ") + kardiz[1:]
return kardiz.capitalize()
Aynen yukarıda olduğu gibi, eğer içinde Türkçe karakterler barındıran karakter dizileriyle uğraşacaksanız, capitalize() metodunu doğrudan kullanmak yerine, if deyimlerinden de yararlanarak kendinize özel çözümler üretebilirsiniz. Yukarıdaki tr_capitalize() adlı fonksiyon her türlü karakter dizisinin ilk harfini büyütecektir.
13.15. title Metodu¶
Şimdi de title() metoduna bakalım... Bu metot bir önceki bölümde incelediğimiz capitalize() metoduna benzer. O metot, bir karakter dizisinin sadece ilk harfini büyütüyordu, bu metot ise bir karakter dizisi içinde geçen bütün kelimelerin ilk harflerini büyütür. Hemen bununla ilgili bir örnek vererek metodun ne işe yaradığını anlamaya çalışalım:
>>> kardiz = "python programlama dili"
>>> kardiz.title()
'Python Programlama Dili'
Bu metot, gördüğünüz gibi, capitalize metodunun aksine karakter dizisinin sadece ilk harfini büyütmekle yetinmedi... Elbette bu metodu istersek doğrudan karakter dizisi üzerine de uygulayabiliriz:
>>> "python programlama dili".title()
'Python Programlama Dili'
Bu metot da Türkçe karakterlerle karşılaştığında genellikle bir sorun çıkarmaz:
>>> a = "çayır çömlek patladı"
>>> a.title()
'Çayır Çömlek Patladı'
Anca.. highlight:: py3 .. _kardiz-metot-upper:k tıpkı capitalize() metodunda olduğu gibi, burada da “i” harfi bize biraz sorun çıkaracaktır:
>>> a = "iyi incir"
>>> a.title()
'Iyi Incir"
Tabii yine endişelenmenize gerek yok. Eğer “i” harfini büyütmeniz gereken bir durumla karşı karşıya kalırsanız, kendi çözümlerinizi kendiniz de üretebilirsiniz. Basit bir örnek verelim yine:
def tr_title(kardiz):
"""Bir karakter dizisi içindeki her bir kelimenin ilk harfini büyütür."""
depo = []
for elem in kardiz.split():
if not "i" in elem[0]:
depo.append(elem.title())
else:
elem = elem[0].replace("i", "İ") + elem[1:]
depo.append(elem)
return " ".join(depo)
13.16. swapcase Metodu¶
Bu metot ile bir karakter dizisinin sahip olduğu büyük-küçük harf yapısını tersine çeviriyoruz. Şu örneğe bakalım:
>>> a = "python programlama"
>>> a.swapcase()
'PYTHON PROGRAMLAMA'
Gördüğünüz gibi, tamamı küçük olan harfler, bu metot yardımıyla tamamı büyük olacak şekilde değişti. Bir de şuna bakalım:
>>> a = "PYTHON PROGRAMLAMA"
>>> a.swapcase()
'python programlama'
Bu defa tamamı büyük olan harfler, bu metot yardımıyla tamamı küçük olacak şekilde değişti... Demek ki bu metot büyük harfleri küçük harfe, küçük harfleri ise büyük harfe dönüştürmeye yarıyor. Bir de şu örneğe bakalım:
>>> a = "Python programlama"
>>> a.swapcase()
'pYTHON PROGRAMLAMA'
swapcase() metodu normal olarak görevini yerine getirdi ve büyük harfleri küçük harfe, küçük harfleri de büyük harfe çevirdi...
Bu metodun da “i” harfiyle sorunu olduğunu tahmin etmişsinizdir. Burada da kendi çözümlerinizi kendiniz üretebilirsiniz:
def tr_swapcase(kardiz):
"""Bir karakter dizisi içindeki büyük-küçük harfleri değiştirir."""
depo = []
for elem in kardiz:
if "i" not in elem:
depo.append(elem.swapcase())
elif "i" in elem and elem.islower():
elem = elem.replace("i", "İ")
depo.append(elem.upper())
else:
depo.append(elem.lower())
return "".join(depo)
13.17. istitle Metodu¶
Hatırlarsanız title() adlı metodu kullanarak bir karakter dizisi içindeki bütün kelimelerin ilk harflerini büyütebiliyorduk. Bu istitle() metoduyla da bir karakter dizisi içindeki bütün kelimelerin ilk harflerinin büyük olup olmadığını sorguluyoruz:
>>> kardiz = "Python Programlama Dili"
>>> kardiz.istitle()
True
>>> kardiz = "Python programlama dili"
>>> kardiz.istitle()
False
Gördüğünüz gibi, eğer karakter dizisi içindeki bütün kelimelerin ilk harfleri büyükse istitle() metodu True çıktısı veriyor. Aksi bir durumda ise False çıktısı alıyoruz...
13.18. ljust Metodu¶
ljust() metodu bize özellikle karakter dizilerinin hizalama işlemlerinde yardımcı olacak. Bu metot yardımıyla karakter dizilerimizi sola yaslayıp, sağ tarafına da istediğimiz karakterleri yerleştirebileceğiz. Hemen bir örnek verelim:
>>> kardiz = "tel no"
>>> kardiz.ljust(10, ".")
'tel no....'
Burada olan şey şu: ljust() metodu, kendisine verilen “10” parametresinin etkisiyle 10 karakterlik bir alan oluşturuyor. Bu 10 karakterlik alanın içine önce 6 karakterlik yer kaplayan “tel no” ifadesini, geri kalan 4 karakterlik boşluğa ise ”.” karakterini yerleştiriyor. Eğer ljust() metoduna verilen sayı karakter dizisinin uzunluğundan az yer tutarsa, karakter dizisinin görünüşünde herhangi bir değişiklik olmayacaktır. Örneğin yukarıdaki örnekte karakter dizimizin uzunluğu “6”. Dolayısıyla kodumuzu şu şekilde yazarsak bir sonuç elde edemeyiz:
>>> kardiz.ljust(5, ".")
'tel no'
Gördüğünüz gibi, karakter dizisinde herhangi bir değişiklik olmadı. ljust() metoduna verdiğimiz ”.” karakterini görebilmemiz için, verdiğimiz sayı cinsli parametrenin en az karakter dizisinin boyunun bir fazlası olması gerekir:
>>> kardiz.ljust(7, ".")
'tel no.'
ljust() metoduyla ilgili basit bir örnek daha verelim:
>>> liste = ["elma", "armut", "patlıcan"]
>>> for i in liste:
... i.ljust(10, ".")
...
'elma......'
'armut.....'
'patlıcan..'
Gördüğünüz gibi, bu metot karakter dizilerini şık bir biçimde sola hizalamamıza yardımcı oluyor...
13.19. rjust Metodu¶
Bu metot, ljust() metodunun yaptığı işin tam tersini yapar. Yani karakter dizilerini sola değil sağa yaslar:
>>> liste = ["elma", "armut", "patlıcan"]
>>> for i in liste:
... i.rjust(10, ".")
...
' elma'
' armut'
' patlıcan'
13.20. center Metodu¶
Bu metot ise karakter dizilerini ne sola ne de sağa yaslar. center() metodunun görevi karakter dizilerini ortalamaktır:
>>> kardiz = "elma"
>>> kardiz.center(10, "-")
'---elma---'
13.21. count Metodu¶
Bu metot ile bir karakter dizisi içindeki harflerin, o karakter dizisi içinde kaç kez geçtiğini öğreneceğiz:
>>> kardiz = "karakter dizisi"
>>> kardiz.count("a")
2
count() metodu ilave olarak bir parametre daha alır. Örnek üzerinden açıklamaya çalışalım:
>>> kardiz.count("a", 0)
2
Burada “0” parametresi, “a” harfini ararken metodumuzun karakter dizisinin kaçıncı sırasından başlaması gerektiğini gösteriyor. Yukarıdaki koda göre, karakter dizisinin 0. sırasından başlayarak, diziyi sonuna kadar tarayacağız ve “a” harfinin kaç kez geçtiğini raporlayacağız. Bir de şu örneğe bakalım:
>>> kardiz.count("a", 2)
1
Bu defa “1” çıktısı almamızın nedeni, “a” harfini karakter dizisinin soldan sağa 2. sırasından itibaren aramamızdır. Gördüğünüz gibi, “karakter dizisi” ifadesi içinde “a” harfi 1 ve 3. sıralarda yer alıyor... Eğer şöyle bir kod yazarsak “0” çıktısı alırız:
>>> kardiz.count("a", 5)
0
Burada “0” çıktısı almamızın nedeni, karakter dizisinin 5. sırasından sonra herhangi bir “a” harfinin bulunmamasıdır.
13.22. find Metodu¶
Bu metot bir karakter dizisi içindeki karakterin sıra numarasını söyler bize:
>>> kardiz = "karakter dizisi"
>>> kardiz.find("t")
5
Buna göre karakter dizimiz içinde “t” harfi 5. sırada bulunuyormuş. Bunu teyit edelim:
>>> kardiz[5]
't'
find() metodundan aldığınız bilgiyi pek çok farklı yerde kullanabilirsiniz. Mesela bir karakter dizisinin belli bir harften sonraki kısmını almak için şöyle bir kod yazabilirsiniz:
>>> kardiz[kardiz.find("t"):]
'ter dizisi'
Bu metot, aradığımız harfin sadece ilk geçtiği sırayı verecektir. Örneğin yukarıdaki karakter dizisinde “a” harfi iki kez geçiyor. Ancak find() metodu yalnızca ilk “a” harfinin sırasını söyler:
>>> kardiz.find("a")
1
Eğer ikinci “a” harfinin sırasını öğrenmek isterseniz find() metodunu şu şekilde kullanabilirsiniz:
>>> kardiz.find("a", 2)
3
Gördüğünüz gibi, find() metoduna sayı değerli bir parametre vererek, bir harfin karakter dizisi içindeki kaçıncı tekrarını almak istediğimizi belirtebiliyoruz.
Eğer find() metodunu kullanarak, bir harfin geçtiği bütün sıra numaralarını almak isterseniz şöyle bir şey yazabilirsiniz:
>>> for i in range(1, kardiz.count("a")+1):
... print(kardiz.find("a", i))
...
1
3
Eğer find() metodu aradığını karakteri bulamazsa “-1” çıktısı verecektir:
>>> kardiz.find("j")
-1
13.23. rfind Metodu¶
Bu metot, find() metoduyla aynı işi yapar. Ama rfind() metodu find() metodunun aksine, bir karakter dizisini sağdan sola doğru tarar:
>>> kardiz = "karakter dizisi"
>>> kardiz.find("a")
3
Gördüğünüz gibi, bu metot ilk “a” harfini değil, ikinci “a” harfini verdi.
Bu metot da tıpkı find() metodu gibi, eğer aradığınız karakteri bulamazsa “-1” çıktısı verecektir...
13.24. index Metodu¶
index() metodu find() metodu ile tamamen aynı işi yapar. Bu iki metot arasındaki tek fark, aranan karakter bulunamadığında verilen çıktıdır. Hatırlarsanız, find() metodunun, aradığımız karakteri bulamaması halinde “-1” çıktısı verdiğini söylemiştik. index() metodu ise, aradığımız karakteri bulamadığında doğrudan bir hata mesajı verecektir:
>>> kardiz.index("g")
ValueError: substring not found
13.25. rindex Metodu¶
Bu metot da tıpkı rfind() metodu gibidir. Burada da tek fark, karakter dizisinin bulunamadığı durumda verilen cevaptır:
>>> kardiz.rindex("g")
ValueError: substring not found
13.26. splitlines Metodu¶
Bu metot, birkaç satırdan oluşan karakter dizilerini satır satır böler:
>>> kardiz = "birinci satır.\nikinci satır.\nüçüncü satır.\ndördüncü satır"
>>> kardiz.splitlines()
['birinci satır.', 'ikinci satır.', 'üçüncü satır.', 'dördüncü satır']
Eğer bu metoda herhangi bir sayı değerli parametre verecek olursanız, şöyle bir çıktı alırsınız:
>>> kardiz.splitlines(1)
['birinci satır.\n', 'ikinci satır.\n', 'üçüncü satır.\n', 'dördüncü satır']
Burada hangi sayıyı verdiğinizin önemi yoktur. Parantez içinde herhangi bir sayı olması durumunda splitlines() metodu satır sonu işaretlerini de (\n) çıktıya dahil edecektir.
13.27. 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
13.28. 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
13.29. 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.
13.30. isdecimal Metodu¶
Bu metot yardımıyla bir karakter dizisinin ondalık sayı cinsinden olup olmadığını denetliyoruz. Mesela aşağıdaki örnek ondalık sayı cinsinden bir karakter dizisidir:
>>> a = "123"
>>> a.isdecimal()
True
Ama şu ise “kayan noktalı” (floating-point) sayı cinsinden bir karakter dizisidir:
>>> a = "123.3"
>>> a.isdecimal()
False
Dolayısıyla a.isdecimal() komutu False çıktısı verir...
13.31. isidentifier Metodu¶
“identifier” kelimesi Türkçe’de “tanımlayıcı” anlamına gelir. Python’da değişkenler, fonksiyon ve modül adlarına “tanımlayıcı” denir. İşte başlıkta gördüğümüz isidentifier() metodu, neyin tanımlayıcı olup neyin tanımlayıcı olamayacağını denetlememizi sağlar. Hatırlarsanız değişkenler konusundan bahsederken, değişken adı belirlemenin bazı kuralları olduğunu söylemiştik. Buna göre, örneğin, değişken adları bir sayı ile başlayamıyordu. Dolayısıyla şöyle bir değişken adı belirleyemiyoruz:
>>> 1a = 12
Dediğimiz gibi, değişkenler birer tanımlayıcıdır. Dolayısıyla bir değişken adının geçerli olup olmadığını isidentifier() metodu yardımıyla denetleyebiliriz:
>>> "1a".isidentifier()
False
Demek ki “1a” ifadesini herhangi bir tanımlayıcı adı olarak kullanamıyoruz. Yani bu ada sahip bir değişken, fonksiyon adı veya modül adı oluşturamıyoruz. Ama mesela “liste1” ifadesi geçerli bir tanımlayıcıdır. Hemen denetleyelim:
>>> "liste1".isidentifier()
True
13.32. isnumeric Metodu¶
Bu metot bir karakter dizisinin “nümerik” olup olmadığını denetler. Yani bu metot yardımıyla bir karakter dizisinin sayı değerli olup olmadığını denetleyebiliriz:
>>> "12".isnumeric()
True
>>> "dasd".isnumeric()
False
13.33. isprintable Metodu¶
Eğer bir karakter ekrana basılabiliyorsa bu metot True çıktısı verecektir. Aksi halde bu metottan “False* yanıtını alırız. Temel olarak bütün harfler, sayılar ve boşluk işareti basılabilir karakterlerdir. Ama örneğin kaçış dizileri basılabilir karakterler değildir:
>>> "a".isprintable()
True
>>> "123".isprintable()
True
>>> "".isprintable()
True
>>> "\n".isprintable()
False
13.34. isspace Metodu¶
Bu metot yardımıyla bir karakter dizisinin tamamen boşluklardan oluşup oluşmadığını denetleyebiliriz. Eğer karakter dizimiz boşluklardan oluşuyorsa bu metot True çıktısı verecek, ama eğer karakter dizimizin içinde bir tane bile boşluk harici karakter varsa bu metot False” çıktısı verecektir:
>>> a = " "
>>> a.isspace()
True
>>> a = " "
>>> a.isspace()
True
>>> a = "" #karakter dizimiz tamamen boş. İçinde boşluk karakteri bile yok...
>>> a.isspace()
False
>>> a = "fd"
>>> a.isspace()
False
13.35. zfill Metodu¶
Bu metot kimi yerlerde işimizi epey kolaylaştırabilir. zfill() metodu yardımıyla karakter dizlerinin sol tarafına istediğimiz sayıda sıfır ekleyebiliriz:
>>> a = "12"
>>> a.zfill(3)
'012'
Bu metodu şöyle bir iş için kullanabilirsiniz:
>>> for i in range(11):
... print(str(i).zfill(2))
00
01
02
03
04
05
06
07
08
09
10
Burada str() metodunu kullanarak range() fonksiyonundan elde ettiğimiz sayıları birer karakter dizisine çevirdiğimize dikkat edin. Çünkü zfill() karakter dizilerinin bir metodudur... Sayıların değil...
13.36. encode Metodu¶
Bu metot yardımıyla karakter dizilerimizi istediğimiz kodlama sistemine göre kodlayabiliriz. Python 3.x’te varsayılan karakter kodlaması “utf-8“‘dir. Eğer istersek şu karakter dizisini “utf-8” yerine “cp1254” ile kodlayabiliriz:
>>> "çilek".encode("cp1254")
13.37. expandtabs Metodu¶
Bu metot yardımıyla bir karakter dizisi içindeki sekme boşluklarını genişletebiliyoruz. Örneğin:
>>> a = "elma\tbir\tmeyvedir" >>> a.expandtabs(10)‘elma bir meyvedir’
13.38. 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’, ‘’, ‘’)
13.39. 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ı.
13.40. str.maketrans ve translate Metotları¶
Bu iki metot birbiriyle bağlantılı olduğu için, bunları bir arada göreceğiz.
Diyelim ki elimizde bir karakter dizisi var ve biz bu karakter dizisini şifrelemek istiyoruz. Bunun için şöyle bir kod yazdığımızı varsayalım:
sözlük = {"a":"0",
"b":"1",
"c":"2",
"ç":"3",
"d":"4",
"e":"5",
"f":"6",
"g":"7",
"ğ":"8",
"h":"9",
"ı":"a",
"i":"b",
"j":"c",
"k":"ç",
"l":"d",
"m":"e",
"n":"f",
"o":"g",
"ö":"h",
"p":"ı",
"r":"i",
"s":"j",
"ş":"k",
"t":"l",
"u":"m",
"ü":"n",
"v":"o",
"y":"ö",
"z":"p",
" ":" "}
kardiz = "python programlama dili"
şifreli = ""
for i in kardiz:
şifreli = şifreli + sözlük[i]
print(şifreli)
Bu kodu çalıştırdığımız zaman şöyle bir çıktı alırız:
ıöl9gf ıig7i0ed0e0 4bdb
Aslında bu çıktıda “python programlama dili” yazıyor. Biz yukarıdaki kodlar yardımıyla karakter dizimizi şifreledik. Python, yazdığımız sözlüğü temel alarak “p” harfi gördüğü yere “ı” harfini; “y” harfi gördüğü yere “ö” harfini, “t” gördüğü yere “l” harfini... yerleştiriyor. Böylece karakter dizimizin çıplak gözle anlaşılmasını engelleyecek bir çıktı veriyor bize. İsterseniz yukarıdaki kodları bir fonksiyon olarak tanımlayıp çok daha verimli bir hale getirebiliriz:
sözlük = {"a":"0",
"b":"1",
"c":"2",
"ç":"3",
"d":"4",
"e":"5",
"f":"6",
"g":"7",
"ğ":"8",
"h":"9",
"ı":"a",
"i":"b",
"j":"c",
"k":"ç",
"l":"d",
"m":"e",
"n":"f",
"o":"g",
"ö":"ğ",
"p":"h",
"r":"ı",
"s":"i",
"ş":"j",
"t":"k",
"u":"l",
"ü":"m",
"v":"n",
"y":"o",
"z":"ö",
" ":" "}
def sifrele(kardiz):
şifreli = ""
for i in kardiz:
şifreli = şifreli + sözlük[i]
return şifreli
print(sifrele("python programlama dili"))
Fonksiyonumuzu bir kez bu şekilde tanımladıktan sonra sadece sifrele() fonksiyonunu kullanarak karakter dizilerimizi şifreleyebiliriz:
>>> print(sifrele("merhaba dünya"))
e5i9010 4nfö0
Burada bazı sorunlar olduğu açık. Mesela sözlük içinde tanımlanmamış karakter kullanıldığında programımız hata verecektir. Ayrıca açıkçası bu kodlar biraz “kalabalık” görünüyor göze...
İsterseniz yukarıdaki işlemi daha sade ve performanslı bir biçimde yapmanın bir yolu vardır Python’da...
Bunun için str.maketrans() ve translate() metotlarından yararlanacağız. Şu kodlara bir bakalım:
kaynak_dizi = "abcçdefgğhıijklmnoöprsştuüvyz"
hedef_dizi = "0123456789abcçdefgğhıijklmnoö"
çeviri_nesnesi = str.maketrans(kaynak_dizi, hedef_dizi)
kardiz = "python programlama dili"
sonuç = kardiz.translate(çeviri_nesnesi)
print(sonuç)
Burada yaptığımız şey çok basit. Öncelikle “kaynak_dizi” adında bir karakter dizisi oluşturduk. Amacımız bir karakter dizisi içindeki karakterleri başka karakterlere dönüştürmek. İşte bu “kaynak_dizi” adlı karakter dizisi özgün kaynak dizimizin karakterlerini temsil ediyor. Alt satırdaki “hedef_dizi” adlı karakter dizisi ise, kaynak dizi içindeki karakterlerin dönüştürüleceği karakterleri gösteriyor. Bu iki karakter dizisini, bir üstteki kodlarda sözlük halinde yazmıştık. Buradaki “kaynak_dizi” adlı karakter dizisi bir önceki kodlardaki sözlüğün “anahtar”larının (keys), “hedef_dizi” adlı karakter dizisi ise sözlüğün “değer”lerinin (values) yerini tutuyor.
Karakter dizilerimizi tanımladıktan sonra str.maketrans() metodunu kullanarak bir “çeviri nesnesi” oluşturacağız. Oluşturacağımız bu çeviri nesnesi, biraz önce tanımladığımız “kaynak_dizi” ve “hedef_dizi” adlı karakter dizilerinin öğelerini birbiriyle eşleştirme vazifesi görecek. Zaten “str.maketrans(kaynak_dizi, hedef_dizi)” satırı bu vazifeyi gözler önüne seriyor... Bu arada maketrans() metodunu, öteki metotlardan farklı olarak str.maketrans() şeklinde kullandığımıza özellikle dikkat edin.
Hemen ardından çeviri işlemine tabi tutacağımız karakter dizimizi yazdık. Bu karakter dizimiz “python programlama dili”.
Daha sonra da “sonuç” adlı bir değişken içinde translate() metodundan faydalanarak yukarıda oluşturduğumuz “çeviri_nesnesi”ni bu metoda argüman olarak veriyoruz. Bu metot, “kardiz” adlı karakter dizisini alıp, yukarıda “çeviri_nesnesi” içinde belirlediğimiz formüle göre çeviri işlemine tabi tutuyor ve ortaya şifrelenmiş bir karakter dizisi çıkarıyor...
13.41. format Metodu¶
format(), karakter dizilerinin en önemli metotlarından biridir. Bu metot Python’un 3.x sürümü ile birlikte dile dahil oldu. Aslında biz bu metodu daha önce Karakter Dizilerini Biçimlendirme konusunu işlerken de anlatmıştık. Burada ise bu metodu biraz daha ayrıntılı bir şekilde inceleyeceğiz.
Dediğimiz gibi, format() metodu Python’a 3.x sürümüyle birlikte dahil oldu. 3.x’ten önce format() metodunun yaptığı işi şu şekilde yerine getiriyorduk:
>>> "%s %s'yi seviyor!"%("Ali", "Ayşe")
'Ali Ayşe'yi seviyor!'
Esasında bu yöntem Python’un 3.x sürümünde de geçerlidir. Yani yukarıdaki yöntemi kullanarak hâlâ karakter dizilerini biçimlendirebiliriz. Ancak bu yöntem artık “eskimiş” olarak kabul ediliyor ve yerini yavaş yavaş format() metoduna bırakıyor. Dolayısıyla yeni yazdığınız kodlarda “%” işareti yerine format() metodunu kullanmanız şiddetle tavsiye edilir...
Gelelim bu metodun ayrıntılarına...
Temel olarak format() metodunu nasıl kullanacağımızı biliyoruz. Basit bir örnek verelim:
>>> zaman = "Cumartesi"
>>> "Seninle {0} günü buluşalım".format(zaman)
'Seninle Cumartesi günü buluşalım'
Burada {0} biçiminde belirttiğimiz kısma, format() metodu içinde belirttiğimiz değişken adı otomatik olarak yerleştiriliyor. Buradaki “0” sayısı, parantez içinde gösterilecek öğelerin sırasına işaret ediyor:
>>> zaman = "Pazartesi"
>>> saat = "12:30"
>>> "Seninle {0} günü saat {1}'da buluşalım".format(zaman, saat)
"Seninle Pazartesi günü saat 12:30'da buluşalım"
Python’un 3.0 sürümünde, yukarıdaki kodlarda görünen {} alanları içine mutlaka sıra belirten bir sayı yazmamız gerekiyordu. Ancak Python’un 3.1 sürümüyle birlikte bu zorunluluk ortadan kaldırıldı. Yani Python 3.1’den itibaren artık yukarıdaki kodları şöyle de yazma imkanına sahibiz:
>>> "Senin {} günü saat {}'da buluşalım".format(zaman, saat)
Eğer istersek yine {} içinde sayı belirtmekte özgürüz. Ama artık bu bir zorunluluk değil... Ama format() metodu içinde belirtilen parametrelerin doğal sırasını bozacaksak, sayıyı belirtmemiz gerekir:
>>> "{1} {0}'yi seviyor!".format("Ali", "Ayşe")
'Ayşe Ali'yi seviyor!'
format() metodu en basit haliyle yukarıdaki gibidir. Ancak bu metot bize çok daha gelişmiş özellikler de sunar. Şu örneğe bir bakalım:
>>> liste = ["elma", "armut", "kebap"]
>>> "listenin ilk öğesi şudur: {0[0]}".format(liste)
>>> "listenin ikinci öğesi şudur: {0[1]}".format(liste)
>>> "listenin üçüncü öğesi şudur: {0[2]}".format(liste)
Gördüğünüz gibi, “{}” alanı içinde liste öğelerini dilimleme imkanına da sahibiz... Yukarıdaki kodları şöyle de yazabiliriz:
>>> "listenin ilk öğesi şudur :", liste[0]
>>> "listenin ikinci öğesi şudur :", liste[1]
>>> "listenin üçüncü öğesi şudur :", liste[2]
Elbette format() metodu yukarıdaki yönteme göre çok daha esnek ve pratiktir...
format() metodunu ayrıca şu şekilde de kullanabiliriz:
>>> "Son güncelleme: {gun} {ay} {yil}".format(gun="27", ay="05", yil="2009")
Burada “{}” alanı içinde isim kullanarak kullanımı daha kolay bir yapı oluşturduğumuza dikkat edin.