Python Programlama Dili

Bölüm 1

Başlangıç Bilgileri

Top Navigasyon

Ders 8

1.18 - Python Program Çıktılarının Biçimlendirilmesi (Formatlanması)

Python program çıktıları sadece print() fonksiyonu ile sağlanırlar. Bu fonksiyon, çıktıları, basit kontrol karakterleri yanında, C programlama dilinin, prinf() fonksiyonu ile aynı klasik biçimlendirme yönteminin yanı sıra, kendine özgü ve Python 2.7 sürümü ile başlayan bir modern biçimlendirme yöntemini de destekler. Bu kısımda, print() fonksiyonunun her iki yeteneğini de inceleyecek ve uygulayacağız.

1.18.1 - Çıktıların printf() Tipi Biçimlendirilmesi

C programlama dilinin çıktılarını sağlayan printf() fonksiyonu şeklinde biçimlendirme sistemi artık eski bir model olarak yürürlükten kalmak üzeredir. Yine de bir bilgi olarak bu yöntemin nasıl çalıştığını görmek yararlı olacaktır.

Bu yöntemde % bir yer değiştirme karakteri olarak kullanılır ve s karakteri sözel, i karakteri tamsayı ve f karakteri bir ondalıklı sayı (float) verisini belirtmek için kullanılır. Blimsel verilerin belirtilmesi için e (exponent) karakteri kullanılır. Örnek olarak, 1.2f bir ondalıklı sayı verisinin tamsayıdan sonra iki hane ondalık olarak görüntüleneceğini belirtir. Bir ondalıklı sayı verinin %e olarak biçimlendirilmesi istenirse, aynen %1.5e gibi bir tamsayı dan sonra 5 hane ondalık ve kendi hesapladığı e üzeri gerekli sayı ile görüntüler. Aynı veri %1.3e ile biçimlendirilirse, bir tamsayı, üç ondalık ve e üzeri gerekli değer kendiliğinden hesaplanıp görüntülenir. Bu konuda açıklayıcı bir program aşağıda görülmektedir.

# Program : ders8program1.py

# Tek özel değer

sokak = "Tavaşi Çeşme Sokak";
print("Bu sokağın ismi = %s dır." %sokak);
    
# Birden çok sözel değer

semt = 'Piyer Loti Caddesi (Cağaloğlu)';
print('%s , %s üzerindedir.' %(sokak, semt));
#Tek tamsayı veri
alan = 3;
print('Bu tarlanın alanı %i dönümdür' %alan);
    
# Tek ondalıklı sayı veri

ds = 5.679395839267348
print('Değer = %1.2f'%ds);
    
#Bilimsel Biçimlendirme

t= .00067947699;
print('Değer = %1.3e' %t);
    
#Birden çok farklı tipte veri

q = 'Değer = ';
w = 25.78;
print('%s %1.1f dir.' %(q , w));    

Bu programın çıktısı:

Bu sokağın ismi = Tavaşi Çeşme Sokak dır.
Tavaşi Çeşme Sokak , Piyer Loti Caddesi (Cağaloğlu) üzerindedir.
Bu tarlanın alanı 3 dönümdür
Değer = 5.68
Değer = 6.795e-04
Değer = 25.8 dir.

olarak gerçekleşmiştir.

Python print() fonksiyonunda, mesajların yeni satıra yönlendirilmesi, "\nMesaj :" şeklinde yapılabildiği gibi,

"""
Mesaj 1 : %s

Mesaj 2 : %s
"""
%(değer1 , değer2

şeklinde de yapılabilir. Oldukça pratik olan bu yöntemin bir uygulaması aşağıda görülmektedir.

# Program : ders8program2.py

değer1 = 55;

değer2 = 33;

print("""Değer 1 :  %s
Değer 2 : %s"""
%(değer1 , değer2)); Bu programın çıktısı: Değer 1 : 55 Değer 2 : 33

Görüldüğü gibi, eski yöntemle biçimlendirme ile, oldukça kolay bir şekilde çekici görüntülü çıktılar alınabilmektedir. Yine de bu artık eski bir biçimlendirme yöntemidir ve günümüzde kullanılmasının gereği yoktur. Bu nedenle, bu çalışmamızda çıktıların daha çok yeni yöntemle biçimlendirilmesine ağırlık vereceğiz.

1.18.2 - Python Çıktılarının Yeni Yöntemle Biçimlendirilmesi

Yeni Python biçimlendirme yöntemi, eskisine göre, daha etkili ve kullanışlıdır. Genel kullanımı

print('Biçimlendirme'.format(Değer));

şeklindedir.

1.18.2.1 - Yeni Yönteme Göre Sözel Verilerin Biçimlendirilmesi

Yeni yönteme göre sözel verilerin temel biçimlendirilmesi, aşağıdaki formata göre uygulanır.

print('Mesaj_1{}'.format('sözel_veri_1'));

Bu yöntem, aşağıdaki programda uygulanmıştır.

# Program : ders8program3.py
    
#Temel Sözel Veri Biçimlendirilmesi

# Veriler Biçimlendirilmiş Şekilleri ile Doğrudan Yazdırılabilir

print('Mesaj_1{}'.format('sözel_veri_1'));
    
# Bir Sözel Veri Değiştirilebilir
        
s1 = 'Mesaj_1{}'.format('sözel_veri_1');
    
print(s1);

# Yeni Bir Biçimlenmiş Sözel Veri Oluşturulup Yazdırılabilir

s2 = 'Mesaj_1{}'.format(' : sözel_veri_1'));
    
print(s2);

  
Bu programın sonucu:


Mesaj_1sözel_veri_1
Mesaj_1sözel_veri_1
Mesaj_1 : sözel_veri_1

Yukarıdaki programdan çok sayıda bilgi alınabilir. Öncellikle, bu yeni biçimlendirme yönteminde değişim bölgesi, desenli parantez {} arasında belirtilmektedir. Desenli parantez ile belirtlen bölgede, format() topluluğundaki(tuple) ilk eleman ile mesaj, sözel veri birleştirilmesi (string concatenation) ile birleştirilip tek bir biçimlendirilmiş sözel veri haline getirilerek görüntülendirilmektedir.

Python derleyicisi, değiştirilecek sözel verinin karakter sayısını kendiliğinden algılmakta ve mesaj ile birleştirildikten sonra oluşan biçimlenmiş sözel verinin toplam karakter uzunluğu mesaj + değiştirilecek sözel verinin toplam karakter sayısı olarak ve arada hiç boşluk kalmayacak şekilde, ilk çıktı satırında görüldüğü gibi görüntülendirilmektedir.

Biçimlendirilmenin, print() fonksiyonu ile yazdırılma (görüntülenme) sırasında olması gereği yoktur. Programda görüldüğü gibi, biçimlendirilmiş bir sözel veri, bir tanıtıcının adresini tanımladığı bir bellek bölgesine yerleştirilip, programın ileri aşamalarında, bağımsız bir sözel veri olarak yararlanılabilir.

Biçimlendirme sonucunda oluşan biçimlenmiş sözel veride, mesaj ve değerin arada boşluk kalmayacak şekilde birleştirilmesi çok hoş bir görüntü vermeyecektir. Bunu biraz daha güzel görünümlü hale getirmek için, programda görüldüğü gibi biraz değişiklik yapılabilir. Olanaklar sonsuzdur ve programda uygulandığı gibi, araya bir boş karakter eklendikten sonra oluşturulan sonuç sözel verisininin görüntüsü, programın son çıktı satırında görülmektedir.

Değişim elemanlarının sanal bir sıralaması vardır ve bu sıralama 0 ınci elamandan başlayarak numaralandırılabilmektedir. Her bir değişim elemanı numarası, format() metodunun sıfırdan başlayan argüman sırasına denk gelmektedir. Varsayılan sıra indisi 0 dır ve yukarıdaki programda olduğu gibi, eğer tek bir değişim elemanı sözkonusu ise, sıra numarası vermeye gerek kalmamaktadır.

Oluşacak biçimlenmiş sözel veride {} parantezlerin kullanımına gereksinme varsa, desenli parantezlarin kaçış karakterleri yine desenli parantezlerdir. Bu durumda, yer değiştirme işlemcisini çift desenli parantezler içinden yani {{{}}} şeklinde kullanmak gerekir. Örnek olarak

sözel_veri = 'Katılanlar : {{{}}}'.format('Ali Mert , Ahmet Cinanoğlu, Dario Benhabib');
print(sözel_veri);

programlama adımları, çıkış ortamına,

Katılanlar : {Ali Mert , Ahmet Cinanoğlu, Dario Benhabib}

yazdıracaktır.

Eğer birden çok sözel veri yer değiştirecekse, bunun için kullanıcının kaygılanması gerekmez. Python derleyicisi, konumsal (pozisyonel) parametrelerin sırasını belleğinde tutar ve yer değiştirmeleri bu sıraya göre yapar. Örnek:

print('{} ve {} en güzel çiçeklerdir.'.format('Glayöl' , 'Gül'));

Bu program adımının sonunda, çıkış ortamına,

Glayöl ve Gül en güzel çiçeklerdir.

yazılacaktır.

Konumsal parametreler yerine, değiştirme elemanlarının sıra numaraları da belirtilebilir. Değiştirme elemanları, format(arg[0] , arg[1] ,arg[2] ...) argümanlarıdır ve argüman sırası bilindiği gibi 0 sırasından başlar. Bu şekilde sonradan değiştirme sırasını değiştirmek istendiğinde, ifadenin yeniden yazılmasına gerek kalmaz. Örnek:

Ali = "Ali Koşar";
Veli = 'Veli Canatar';
print("""Bu maçta en iyi performans gösterenler : 
1 - {0}
2 - {1}
olmuştur."""
.format(Ali , Veli));

Bu programın çalışması ile çıkış ortamına,

Bu maçta en iyi performans gösterenler : 
1 - Ali Koşar
2 - Veli Canatar
olmuştur.

yazılacaktır. İstendiğinde, yazdırma sırası değiştirilebilir ve ikinci eleman daha önce, birinci eleman ise ikinciden sonra yazdırılabilir. Böylece, oyuncuların gösterdikleri performans hakkında görüşler değişirse, programın yeniden yazılmasına gerek kalmaz.

print("""Bu maçta en iyi performans gösterenler : 
1 - {1}
2 - {0}
olmuştur."""
.format(Ali , Veli));

Bu programın çalışması ile çıkış ortamına,

Bu maçta en iyi performans gösterenler : 
1 - Veli Canatar
2 - Ali Koşar
olmuştur.

yazılacaktır.

Numaralandırılmış değişim parametreleri, değiştirilecek sözcüklerin tekrarlanabilmesini sağlar. Örnek olarak,

print('Aslında {0} {0} sinemaya gitmek istemiyorum.'.format('sabah'));

program adımı, standart çıktı ortamında,

Aslında sabah sabah sinemaya gitmek istemiyorum.

mesajını görüntülendirir.

Sıralama amacı ile sadece sayısal indisler degil, sözel indisler de kullanılabilir. Sözel indisler JavaScript ilişkisel diziler (associative arrays) veya Python sözlük tipi verilerin anahtar (key) değerlerine benzerler. Sözel indisler, aynen sayısal indisler gibi, değiştirilerecek olan terimlerin değişim sırasını belirler. Bu konuda bir örnek, aşağıda görülmektedir.

# Program : Ders8program4.py

print('{Sufle} {masaya} {geldi} mi?'.format(Sufle = 'Paralar' , masaya = 'kasaya' , geldi = 'girdi'));

Program Sonucu :    

Paralar kasaya girdi mi?

Python derleyicisi değiştirilecek sözel değerlerin uzunluğunu otomatik olarak algıladığından genellikle değişecek sözel veri için mesaj kısmında yer açmak için özel bir çaba sarfedilmesi gerekmeyebilir. Özellikle, yer değişecek olan sözel veri, aşağıda görüldüğü gibi mesajın sonuna eklenecek ise,

print('Ankaranın en sevdiğim yeri, {}'.format('Anadolu Uygarlıkları Müzesidir.'));
    

eklenecek sözel verinin yerleşeceği yer için, önceden bir veri uzunluğu ayarlaması yapılması tam olarak gereksizdir. Bu durumda, Python derleyicisi, gerekli uzunlukta bir yer açacak ve eklenecek veriyi buraya sorunsuzca yerleştirecektir.

Buna rağmen, bazı durumlarda, daha güzel görünüşlü ve daha kolay okunabilecek çıktılar alabilmek için, yer değişecek verinin yerleşeceği yerin uzunluğunun önceden belirlenmesi gereği olabilir. Bunun için gerekli olanaklar sağlanmıştır.

Değişecek veri için belirli karakter sayısı içeren bir yerleşme yeri hazırlanması için iki ayrı yöntem uygulanabilir. Bunlardan ilki, aşağıda görülen programda uygulanmıştır.

# Program : Ders8program5.py

print("{0:30}{1:10}{2:5}{3:5}".format("Fasulye :", "15", "TL", "(kilo)"));
    
print("{0:31}{1:9}{2:5}{3:5}".format("Kabak :", "5", "TL", "(kilo)"));

Program Sonucu :    

Fasulye : 15 TL (kilo) Kabak : 5 TL (kilo)

Yukarıdaki programda yer değiştirme terimleri birer tek elemanlı sözlük tipleridir. Bunlar{anahtar:değer} şeklinde düzenlenmiştir. Anahtar değerleri değiştirilecek sözel değerlerin sıra numarasıdır. Değerler ise, değişecek sözel değerlerin yerleştirileceği karakter sayısıdır. Değişecek olan değerler, format("Fasulye :", "15", "TL", "(kilo)") şeklinde bir topluluk (tuple) olarak yerleştirilmiştir. Bu değişeşecek değerler topluluğunun her elemanı, sözlük verilerinin anahtar değerleri olan indis sayıları ile belirtilmektedir. Değişecek değerler, sözlük verilerinin değeri olarak belirtilen karakter sayısı kadar geniş alana, varsayılan olarak sola yaslı şekilde görüntülenirler.

Değişecek sözel değerleri belirli bir uzunluktaki alana yerleştirmek için, ikinci bir yöntem, aşağıdaki programda uygulanmıştır.

# Program : Ders8program6.py

print("Kadıköyden kalkan {0:{1}} vapuru {2:{3}} iskelesinden kalkar.".format("Adalar", 6 ,"kendi" , 5));
    
Program Sonucu :
    


Kadıköyden Kadıköyden kalkan Adalar vapuru kendi iskelesinden kalkar.

Yer değiştirme kodlarının çok iyi anlaşılması gerekir. İlk önce, format() şeklinde tanımlanan parantez içi bir veriler bir topluluk (tuple tipi ver olarak düşünülebilir. Bu topluluk, ('Adalar' , 6, 'kendi', 5) şeklindedir. Bu topluluk tipi verinin, ilk elemanı, indis değeri 0 olan 'Adalar' değeridir. İkinci eleman, indis değeri 1 olan 6 sayısıdır. Üçüncü eleman, indis değeri 2 olan, 'kendi' sözel değeridir. Dördüncü ve son eleman, indis değeri 3 olan 5 sayısal değeridir. Bu topluluk, içindeki veriler, ikili çiftler halinde sözlük tipi veriler olarak da düşünülebilir. Bu durumda (indis [0]: indis [1], indis [2]: indis [3]) şeklinde bir sanal sözlük yapılanmasını düşünebiliriz. Bu yapılanma, her sözlük verisi gibi, sözel bir anahtar değeri: değer şeklinde organize olmuş gibidir. Dikkat edilirse topluluk elemanlarının anahtar olarak kullanılan indis değeri [0] ve [2] olan elamanları sözel değerlerdir Bu durumda, sanal sözlük {'Adalar': 6 , 'kendi' : 5} şeklinde düzenlenmiş olarak kabul edilebilir. Anahtar değerleri, yerleştirilecek olan sözel değerler, anahtar değerlerine karşı gelen veriler ise, anahtar değerlerinin  yerleştirilecekleri alan uzunluğudur.

Bu bilgilerle,

Belki en kolay anlaşılır biçimlendirme yöntemi, isimlendirme ile uygulanan ve aşağıdaki programda uygulanan yöntem olabilir.

# Program : Ders8program7.py

print("yiyecek : {yiyecek:{uzunluk}} Fiyat :{fiyat:{uzunluk1}} TL \
".format(yiyecek = "Fasulye", uzunluk = 20, fiyat = "15" , uzunluk1 = 20));

Program Sonucu :
    

yiyecek : Fasulye              Fiyat :15                   TL       

Yukarıda görülen biçimlendirme yöntemi, prensip olarak bir önceki yöntemle aynıdır. Buradaki fark sadece sayısal değil, sözel değişim indislerinin kullanılmış olmasıdır. Kullanılan sözel değişim indisleri, biçimlendirme yöntemini, daha kolay anlaşılır kılmaktadır.

Yukarıdaki programda, uzun olan bir sözel verinin görüntüsünü sayfanın görünür kısmında tutmak, yani kaydırma çubuğunun kullanılmasına gerek bırakmamak için, \ kodunun kullanıldığı görülebilir. Programlarda, uzun olabilecek satırları bölmek için bu yöntem kullanılabilir. Bu şekilde, görüntü,

"Bir sözel \
verinin iki satırda gösterimi"

şeklinde iki satıra yayılabilir. Burada sadece görüntü iki satıra yayılmıştır. Python derleyicisine göre, sözel veri hala,

"Bir sözel verinin iki satırda gösterimi"

şeklinde tek bir sözel veridir.

Bütün bu biçimlendirme sonuçlarından, göze güzel görünecek çıktıların alınabilmesi için, bazen değişecek elemanların yerleşme uzunluğunun önceden belirlenmesi yanında, yerleşecek elemanların yaslanma şekillerinin de önceden belirlendiği şekilde biçimlemeler yapılmasının yararlı olabileceği farkedilebilebir. Bu şekilde biçimlemelerin yapılabilmeleri için olanaklar sağlanmştır.

Değişecek elemanların, alan uzunlukları yanında, yaslanma şekilleri aşağıda görüldüğü gibi belirtilebilir.

Görüldüğü gibi, yaslama şekilleri üzerine kullanıcının kontrolü de sağlanmıştır. Aşağıdaki programda, bu konuda yapılmış olan bir uygulama görülmektedir.

# Program : Ders8program8.py

print("yiyecek : {yiyecek:{uzunluk}} Fiyat :{fiyat:>{uzunluk1}} TL \
"
.format(yiyecek = "Fasulye", uzunluk = 20, fiyat = "15.00" , uzunluk1 = 10)); print("yiyecek : {yiyecek:{uzunluk}} Fiyat :{fiyat:>{uzunluk1}} TL \
"
.format(yiyecek = "Top Lahana", uzunluk = 20, fiyat = "7.25" , uzunluk1 = 10)); print("yiyecek : {yiyecek:{uzunluk}} Fiyat :{fiyat:>{uzunluk1}} TL \
"
.format(yiyecek = "Marul", uzunluk = 20, fiyat = "2.75" , uzunluk1 = 10)); print("{sub:_>{uzunluk}}".format(sub = "", uzunluk = 51)); print("\n{toplam:*<{uzunluk}}{fiyat:*>{uzunluk1}} TL \
"
.format(toplam = "Toplam : ", uzunluk = 20, fiyat = "25.00" , uzunluk1 = 28));
Program Sonucu : yiyecek : Fasulye Fiyat : 15.00 TL yiyecek : Top Lahana Fiyat : 7.25 TL yiyecek : Marul Fiyat : 2.75 TL ___________________________________________________ Toplam : *********************25.00 TL

Yukarıdaki programın kodlarının dikkatle incelenmesi ile sözel verilerin, hizalamayı da içeren biçimlendirilmelerinin uygulamaları, kolaylıkla anlaşılabilecektir.

Sözel veriler, bir format() fonksiyonun kullanımı ile, bir biçimlendirme şablonu halinde uygulanabilir Bu şekilde bir uygulama aşağıda görülmektedir.

# Program : Ders8program9.py

elektronikPosta = " Elektronik posta adresim : {ePosta}".format;

print(elektronikPosta(ePosta = "bedri@bedriemir.com"));

print(elektronikPosta(ePosta = "bedriemir@gmail.com"));


"""
Program Sonucu :

Elektronik posta adresim : bedri@bedriemir.com
Elektronik posta adresim : bedriemir@gmail.com
"""

Bu uygulama Python String Format Cookbook dan alınmıştır. Bu site de, reddit de earthboundkids tarafından gönderilen bir yorumdan yararlanmış olduğunu belirtmiştir. Bu bir standart biçimlendirme değil, bir düzenlemedir. Her iki site de çok yararlı Python bilgileri ve site bağlantıları içermektedir.

Bilgi Notu:

Bu sayfa çok kullanışlı sözel veri biçimlendirme yöntemlerini içermektedir. Bu sayfa bastırılıp saklanırsa, çok yararlı bir biçimlendirme bilgi kaynağı olarak kullanılabilir.

Sözel verilerin biçimlendirilmesi konusunda verilecek bilgiler burada tamamlanmaktadır. Bir sonraki sayfada, sayısal bilgilerin güncel yöntemle biçimlendirilmeleri incelenecektir.