Diyelim ki, yazdığınız programda kullanıcıya bir parola soruyorsunuz. Amacınız bu parolanın, programınızda belirlediğiniz ölçütlere uyup uymadığını tespit etmek.
Eğer kullanıcı tarafından belirlenen parola uygunsa ona şu çıktıyı göstermek istiyorsunuz (parolanın b5tY6g olduğunu varsayalım):
Girdiğiniz parola (b5tY6g) kurallara uygun bir paroladır!
Bu çıktıyı elde etmek için şöyle bir kod yazabilirsiniz:
parola = input("parola: ")
print("Girdiğiniz parola (" + parola + ") kurallara uygun bir paroladır!")
Gördüğünüz gibi, sadece karakter dizisi birleştirme yöntemlerini kullanarak istediğimiz çıktıyı elde ettik, ama farkettiyseniz bu defa işler biraz da olsa zorlaştı.
Bir de uzun ve karmaşık bir metnin içine dışarıdan değerler yerleştirmeniz gereken şöyle bir metinle karşı karşıya olduğunuzu düşünün:
Sayın .........
.... tarihinde yapmış olduğunuz, ........ hakkındaki başvurunuz incelemeye alınmıştır.
Size .... işgünü içinde cevap verilecektir.
Saygılarımızla,
......
Böyle bir metin içine dışarıdan değer yerleştirmek için karakter dizisi birleştirme yöntemlerine başvurmak işinizi epey zorlaştıracaktır.
format()
metodu Python’ın 3.x sürümleri ile dile dahil olan bir özelliktir. Python’ın 2.x sürümlerinde bu metodu kullanamazsınız.
Biz bu derste yukarıda adını andığımız format yöntemi inceleyeceğiz.
format() Metodu ile Biçimlendirme
format()
metodunu en basit şekilde şöyle kullanıyoruz:
>>> print("{} ve {} iyi bir ikilidir!".format("Django", "Python"))
Django ve Python iyi bir ikilidir!
Çok basit bir örnek daha verelim:
isim = input("İsminiz: ")
print("Merhaba {}. Nasılsın?".format(isim))
Elbette bu örneği şu şekilde de yazabilirdik:
isim = input("İsminiz: ")
print("Merhaba", isim + ".", "Nasılsın?")
Burada format()
metodunu ve biçim düzenleyicileri hiç kullanmadan, sadece karakter dizilerini birleştirerek istediğimiz çıktıyı elde ettik.
Ama siz de görüyorsunuz; karakter dizilerini birleştirmekle uğraşacağımıza format()
metodunu kullanmak hem daha pratiktir, hem de bu şekilde yazdığımız kodlar daha okunaklı olur.
Yukarıdaki örnekte format()
metodunu tek bir parametre ile birlikte kullandık (isim). Bu parametre, karakter dizisi içindeki {} işaretine karşılık geliyor.
Bu konuyu daha iyi anlayabilmek için bir örnek daha verelim:
kalkış = input("Kalkış yeri: ")
varış = input("Varış yeri: ")
isim_soyisim = input("İsim ve soyisim: ")
bilet_sayısı = input("Bilet sayısı: ")
print("""{} noktasından {} noktasına, 14:30 hareket saatli
sefer için {} adına {} adet bilet ayrılmıştır!""".format(kalkış,
varış,
isim_soyisim,
bilet_sayısı))
Gördüğünüz gibi, {} işaretleri karakter dizisi içinde bir ‘yer tutma’ görevi görüyor. Tutulan bu yerlere nelerin geleceğini format()
metodunun parametreleri vasıtasıyla belirliyoruz.
Elbette eğer isterseniz yukarıdaki örneği şu şekilde de yazabilirsiniz:
kalkış = input("Kalkış yeri: ")
varış = input("Varış yeri: ")
isim_soyisim = input("İsim ve soyisim: ")
bilet_sayısı = input("Bilet sayısı: ")
metin = "{} noktasından {} noktasına, 14:30 hareket saatli \
sefer için {} adına {} adet bilet ayrılmıştır!"
print(metin.format(kalkış, varış, isim_soyisim, bilet_sayısı))
Ancak yaygın olarak kullanılan yöntem, karakter dizisini herhangi bir değişkene atamadan, doğrudan format()
metoduna bağlamaktır.
Verdiğimiz bu örneği, her zaman olduğu gibi, format()
metoduna başvurmadan yazmak da mümkündür:
kalkış = input("Kalkış yeri: ")
varış = input("Varış yeri: ")
isim_soyisim = input("İsim ve soyisim: ")
bilet_sayısı = input("Bilet sayısı: ")
print(kalkış, "noktasından", varış, "noktasına, 14:30 hareket saatli \
sefer için", isim_soyisim, "adına", bilet_sayısı, "adet bilet ayrılmıştır!")
Mesela şöyle bir programı format()
metodu kullanmadan yazmaya çalışmak hiç akıl kârı değildir:
kodlama = "utf-8"
site_adı = "Python Programlama Dili"
dosya = open("deneme.html", "w", encoding=kodlama)
içerik = """
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset={}" />
<title>{}</title>
</head>
<body>
<h1>istihza.com web sitesine hoş geldiniz!</h1>
<p><b>{}</b> için bir Türkçe belgelendirme projesi...</p>
</body>
</html>
"""
print(içerik.format(kodlama, site_adı, site_adı), file=dosya)
dosya.close()
Küme parantezlerini, yukarıdaki örneklerde görüldüğü şekilde içi boş olarak kullanabilirsiniz.
Böyle bir durumda Python, karakter dizisi içindeki küme parantezleriyle, karakter dizisi dışındaki değerleri teker teker ve sırasıyla eşleştirecektir.
Ama isterseniz küme parantezleri içine birer sayı yazarak, karakter dizisi dışındaki değerlerin hangi sırayla kullanılacağını belirleyebilirsiniz. Örneğin:
>>> "{0} {1}".format("Fırat", "Özgül")
'Fırat Özgül'
Küme parantezleri içinde sayı kullanabilme imkanı sayesinde değerlerin sırasını istediğiniz gibi düzenleyebilirsiniz:
>>> "{1} {0}".format("Fırat", "Özgül")
'Özgül Fırat'
Hatta bu özellik sayesinde değerleri bir kez yazıp, birden fazla sayıda tekrar edebilirsiniz:
>>> "{0} {1} ({1} {0})".format("Fırat", "Özgül")
'Fırat Özgül (Özgül Fırat)'
Dolayısıyla, {} işaretleri içinde öğelerin sırasını da belirterek, biraz önce verdiğimiz HTML sayfası örneğini şu şekilde yazabilirsiniz:
kodlama = "utf-8"
site_adı = "Python Programlama Dili"
dosya = open("deneme.html", "w", encoding=kodlama)
içerik = """
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset={0}" />
<title>{1}</title>
</head>
<body>
<h1>istihza.com web sitesine hoş geldiniz!</h1>
<p><b>{1}</b> için bir Türkçe belgelendirme projesi...</p>
</body>
</html>
"""
print(içerik.format(kodlama, site_adı), file=dosya)
dosya.close()
Yukarıdaki örnekler bize, format()
metodunun parametrelerine sıra numarasına göre erişebileceğimizi gösteriyor. Biz aynı zamanda bu metodun parametrelerine isme göre de erişebiliriz. Çok basit bir örnek:
print("{dil} dersleri".format(dil="python"))
Bu yöntemi kullanarak, aynı değişkeni birkaç farklı yerde kullanabilirsiniz:
sayfa = """
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>{konu}</title>
</head>
<body>
<h1>istihza.com web sitesine hoş geldiniz!</h1>
<p><b>{konu}</b> için bir Türkçe belgelendirme projesi...</p>
</body>
</html>
"""
print(sayfa.format(konu="Python Programlama Dili"))
format()
metodunun yetenekleri yukarıda gösterdiğimiz şeylerle sınırlı değildir. {} işaretleri arasında bazı sayılar kullanarak, karakter dizileri üzerinde hizalama işlemleri de yapabiliriz.
Dikkatlice bakın:
>>> print("{:>15}".format("istihza"))
istihza
: işareti, bir biçimlendirme işlemi yapacağımızı gösteriyor. > işareti ise bu biçimlendirmenin bir hizalama işlemi olacağını haber veriyor.
En sondaki 15 sayısı ise bu hizalama işleminin 15 karakterlik bir alan ile ilgili olduğunu söylüyor. Bu şekilde karakter dizisini 15 karakterlik bir alan içine yerleştirip karakter dizisini sağa yasladık.
Yukarıdaki çıktıyı daha iyi anlayabilmek için kodları şöyle de yazabilirsiniz:
>>> print("|{:>15}|".format("istihza"))
| istihza|
Gördüğünüz gibi, karakter dizimiz, kendisine ayrılan 15 karakterlik alan içinde sağa yaslanmış vaziyette duruyor.
Eğer aynı karakter dizisini sola yaslamak isterseniz şöyle bir şey yazabilirsiniz:
>>> print("|{:<15}|".format("istihza"))
|istihza |
Yukarıdaki yöntemi kullanarak, karakter dizilerini sola veya sağa yaslamanın yanısıra, kendilerine ayrılan alan içinde ortalayabilirsiniz de:
>>> print("|{:^15}|".format("istihza"))
| istihza |
Gördüğünüz gibi, python3 ile gelen format()
metodunu hizalama işlemleri için kullanırken üç farklı işaretten yararlanıyoruz:
> | sağa yaslama |
< | sola yaslama |
^ | ortalama |
Biçimlendirme Karakterleri
format()
metodu ile birlikte şu harfleri kullanabiliyoruz:
s
Bu harf karakter dizilerini temsil eder.
>>> print("{:s}".format("karakter dizisi"))
karakter dizisi
Gördüğünüz gibi biçimlendirme karakterini kullanırken, karakterin sol tarafına bir adet : işareti de yerleştiriyoruz. Bir örnek verelim:
print("{:s} ve {:s} iyi bir ikilidir!".format("Python", "Django"))
Yalnız, s harfi karakter dizilerini temsil ettiği için, {} işaretleri arasında bu harfi kullandığımızda, format()
metodunun alabileceği parametreyi karakter dizisiyle sınırlandırmış oluruz.
Dolayısıyla bu harfi kullandıktan sonra format()
metodu içinde sadece karakter dizilerini kullanabiliriz. Eğer sayı kullanırsak Python bize bir hata mesajı gösterecektir:
>>> print("{:s}".format(12))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: Unknown format code 's' for object of type 'int'
Bu yüzden, eğer amacınız format()
metoduna parametre olarak karakter dizisi vermekse, {} işaretleri içinde herhangi bir harf kullanmamak daha akıllıca olabilir:
print("{} ve {} iyi bir ikilidir!".format("Python", "Django"))
c
Bu harf 0 ile 256 arası sayıların ASCII tablosundaki karşılıklarını temsil eder:
>>> print("{:c}".format(65))
A
d
Bu harf sayıları temsil eder:
>>> print("{:d}".format(65))
65
Eğer sayı dışında bir değer kullanırsanız Python size bir hata mesajı gösterir:
>>> print("{:d}".format("65"))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: Unknown format code 'd' for object of type 'str'
o
Bu harf onlu düzendeki sayıları sekizli düzendeki karşılıklarına çevirir:
>>> print("{:o}".format(65))
101
x
Bu harf onlu düzendeki sayıları onaltılı düzendeki karşılıklarına çevirir:
>>> print("{:x}".format(65))
41
X
Tıpkı x harfinde olduğu gibi, bu harf de onlu düzendeki sayıları onaltılı düzendeki karşılıklarına çevirir:
>>> "{:X}".format(65)
'41'
Peki x ile X harfi arasında ne fark var? Fark şudur: x; onaltılı düzende harfle gösterilen sayıları küçük harf şeklinde temsil eder.
X işareti bu sayıları büyük harf şeklinde temsil eder. Bu ikisi arasındaki farkı daha net görmek için şöyle bir kod yazabilirsiniz:
>>> for i in range(20):
... print("{:x}{:10X}".format(i, i))
...
0 0
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
a A
b B
c C
d D
e E
f F
10 10
11 11
12 12
13 13
b
Bu işaret, onlu düzendeki sayıları ikili düzendeki karşılıklarına çevirir:
>>> "{:b}".format(2)
'10'
f
Bu işaret, karakter dizileri içindeki kayan noktalı sayıları temsil etmek için kullanılır.
print("{:.2f}".format(50))
50.00
.2 gibi bir ifade yerleştirerek noktadan sonra 2 hane olmasını sağladık.
,
: işaretini , işareti (basamak ayracı) ile birlikte kullanarak, sayıları basamaklarına ayırabilirsiniz:
>>> "{:,}".format(1234567890)
'1,234,567,890'
Buradaki bilgileri kullanarak bol bol örnek yapmak bu konuyu daha iyi anlamanıza yardımcı olacaktır.
Bu eğitim seti Kaynak tarafından oluşturulmuştur.