Formatlaşdırmanın yeni üsulu

Mövzumuzun əvvəlində qeyd etmişdik ki, Python proqramlaşdırma dilində çıxışların formatlaşdırılmasında üstünlük verilən üsul string sinfinin format metodudur. Çox çevik olan format metodunun ümumi yazılış forması aşağıdakı kimidir:

şablon.format(p0, p1, ..., k0=v0, k1=v1, ...)

Burada şablon formatlaşdırmaq istədiyimiz sətirdir. Bu sətrə bir və ya bir neçə format kodu, başqa sözlə, əvəzlənən sahələr daxil edilir. Fiqurlu {} mötərizə daxilində yazılan format kodları verilmiş arqumentləri formatlaşdıraraq sətir daxilində öz yerinə qoyur. Buradakı arqumentlər isə iki növdə verilə bilər: mövqeli (p0, p1,…) və açar sözlü (k0=v0, k1=v1,…). Qeyd edək ki, formatlaşdırma zamanı mövqeli və açar sözlü arqumentləri həm ayrı-ayrılıqda, həm də eyni zamanda (öndə mövqelilər, ardınca açar sözlülər olmaqla) istifadə etmək mümkündür.

Aşağıdakı sxem format metodunun mövqeli arqumentlərlə necə işlədiyini göstərir:


Yuxarıdakı yazılışdan da gördüyünüz kimi, mövqeli arqumentlər format kodları vasitəsilə şablonda (formatlaşdırılan sətirdə) öz yerlərinə qoyulur. Bizim nümunədə iki format kodu var: {0:5d}{1:8.2f}. Hər bir format kodu sıra sayı, qoşa nöqtə və format şəklindən (opsiya, genişlik və tip) ibarətdir.

>>> "Məhsul kod:{0:5d}, qiymət:{1:8.2f}".format(254, 65.076)
'Məhsul kod:  254, qiymət:   65.08'
>>>

Aşağıda verilmiş digər nümunələri də nəzərdən keçirin:

>>> "1-ci arqument: {0}, 2-ci arqument: {1}".format(55,11)
'1-ci arqument: 55, 2-ci arqument: 11'
>>> "2-ci arqument: {1}, 1-ci arqument: {0}".format(55,11)
'2-ci arqument: 11, 1-ci arqument: 55'
>>> "2-ci arqument: {1:3d}, 1-ci arqument: {0:7.2f}".format(55.23,11)
'2-ci arqument:  11, 1-ci arqument:   55.23'
>>> "1-ci arqument: {}, 2-ci arqument: {}".format(55,11)
'1-ci arqument: 55, 2-ci arqument: 11'
>>> "Müxtəlif dəqiqlik: {0:6.2f} və {0:6.3f}".format(1.6238)
'Müxtəlif dəqiqlik:   1.62 və  1.624'
>>>

Burada bir məqamı da qeyd edək ki, mövqeli arqumentlərdən verilmiş ardıcıllıqda istifadə edildiyi təqdirdə şablondakı format kodlarında sıra sayını, dördüncü nümünədə olduğu kimi, boş buraxmaq olar.
Aşağıdakı sxem isə format metodunun açar sözlü arqumentlərlə necə işlədiyini göstərir:

Sxemdən gördüyünüz kimi, açar sözlü arqumentlər də mövqeli arqumentlər kimi format kodları vasitəsilə şablonda (formatlaşdırılan sətirdə) öz yerlərinə qoyulur. Burada fərq yalnız ondan ibarətdir ki, arqumentlər açar=qiymət şəklində göstərilir.

>>> "Məhsul kod: {a:5d}, qiymət: {b:8.2f}".format(a=254, b=65.076)
'Məhsul kod:   254, qiymət:    65.08'
>>>

Çıxışları format metodu ilə formatlaşdırarkən format kodlarında əlavə olaraq aşağıdakı opsiyalardan da istifadə edə bilərsiniz:

OpsiyaTəyinatı
<Çıxış veriləni soldan nizamlanır. Sətirlər üçün bu, adətən, default (susmaya görə) nizamlanmadır.
>Çıxış veriləni sağdan nizamlanır. Ədədlər üçün bu default (susmaya görə) nizamlanmadır.
^Çıxış veriləni onun üçün ayrılmış yerdə mərkəzdən nizamlanır.
0Format şəkli daxilində genişlikdən öncə yazıldıqda, ədəd tipli çıxışların önünü boş mövqelərin sayı qədər sıfırlarla tamamlayır.
,Ədəd tipli çıxışları minlik ayırıcı simvol ilə çıxarır.
=Ədəd tipli çıxışlarda ədəd ilə işarəsinin (əgər varsa) arasını ön məsafə (və ya verilmiş simvol) ilə doldurur.
+Ədəd tipli çıxış verilənlərinin önündə mənfi ədədlərdə olduğu kimi, müsbət ədədlərdə də onların işarəsini çıxarır. 
Çıxış veriləni yalnız mənfi ədəd olduqda önündə onun işarəsini çıxarır. Bu, onsuz da default olaraq (susmaya görə) belədir.
boşluqÇıxış veriləni müsbət ədəd olduqda önünə boşluq (probel) qoyur.

Aşağıda verilmiş nümunələri nəzərdən keçirin:

>>> '{0:<20s} {1:4d}'.format('Təvəllüd:',1978)
'Təvəllüd:            1978'
>>> '{0:>20s} {1:4d}'.format('Təvəllüd:',1978)
'           Təvəllüd: 1978'
>>> '{0:^20s} {1:4d}'.format('Təvəllüd:',1978)
'     Təvəllüd:       1978'
>>>
>>> 'Sıra sayı: {:06d}'.format(125)
'Sıra sayı: 000125'
>>> 'Büdcə kəsiri: {:,d} manat'.format(1698000000)
'Büdcə kəsiri: 1,698,000,000 manat'
>>> '{:=6d}'.format((-23))
'-   23'
>>> "Anarın {:*=6d} manat pulu var".format(15)
'Anarın ****15 manat pulu var'
>>>
>>> 'Bakı {:+2d}°C'.format(5)
'Bakı +5°C'
>>> 'Bişkek {:+2d}°C'.format(-5)
'Bişkek -5°C'
>>> 'Aşqabad {:-2d}°C'.format(12)
'Aşqabad 12°C'
>>> 'Astana {:-2d}°C'.format(-12)
'Astana -12°C'
>>>
>>> '{: d}'.format(15)
' 15'
>>> '{: d}'.format(-15)
'-15'
>>>

Yeri gəlmişkən, bir məsələni də aydınlaşdıraq. Diqqət yetirsəniz, görəcəksiniz ki, formatlaşdırılmış çıxışlar ekrana dırnaq işarələri arasında çıxır:

>>> "{cnt} - {cap}".format(cnt = "Azərbaycan", cap = "Bakı")
'Azərbaycan - Bakı'
>>>

print() funksiyasından istifadə etməklə “dırnaqsız” çıxış ala bilərik:

>>> print("{cnt} - {cap}".format(cnt = "Azərbaycan", cap = "Bakı"))
Azərbaycan - Bakı
>>>

Burada əlavə dəyişəndən istifadə etməklə yazılışı sadələşdirmək də mümkündür:

>>> s = "{cnt} - {cap}"
>>> print(s.format(cnt = "Azərbaycan", cap = "Bakı"))
Azərbaycan - Bakı
>>>

format metodunda lüğətlərin istifadəsi

Artıq bilirsiniz ki, yeni üsulla çıxışlar mövqeli və/və ya açar sözlü arqumentlərdən istifadə etməklə formatlaşdırılır. Mövqeli arqumetlərlə bağlı qeyri-adi heç nə yoxdur, amma açar sözlü arqumentlərə diqqətlə baxsanız, sizə əvvəlki mövzulardan tanış gələn bir şey görəcəksiniz:

>>> s = "{cnt} - {cap}"
>>> print(s.format(cnt = "Azərbaycan", cap = "Bakı"))
Azərbaycan - Bakı
>>>

Yəqin ki, xatırladınız, buradakı arqumentlər lüğətdir, yəni dictionary tipindəki verilənlərdir. O zaman yuxarıdakı misalı aşağıdakı şəkildə də yaza bilərik:

>>> cnt_cap = {"cnt":"Azərbaycan", "cap":"Bakı"}
>>> s="{cnt} - {cap}"
>>> print(s.format(**cnt_cap))
Azərbaycan - Bakı
>>> 

Burada arqumentlərin sayı lüğətin elementlərinin sayından asılıdır. Başqa sözlə, format metoduna ötürülən açar sözlü arqumentlərin sayı ixtiyaridir.  Məhz buna görə də, metod daxilindəki cnt_cap parametrinin önünə qoşa ulduz (**) simvolu qoyulmalıdır. Xatırlayırsınızsa, biz funksiyaları ixtiyari uzunluqlu arqumentlərlə təyin edərkən də bu qoşa ulduzdan (**) istifadə edirdik.

Gəlin daha bir proqram yazaq. Bu proqram Türk dövlətlərinin adlarını paytaxtları ilə bərabər ekrana çıxaracaq:

turk_rep = {"Azərbaycan":"Bakı",
            "Türkiyə":"Ankara",
            "Qazaxıstan":"Astana",
            "Qırğızıstan":"Bişkek",
            "Özbəkistan":"Daşkənd",
            "Türkmənistan":"Aşqabad",
            "Macarıstan":"Budapeşt"
            "ŞKTR":"Şimali Lefkoşa"}

print("Türk Dövlətləri və paytaxtları:")
for a in turk_rep:
    s = a + " - {" + a + "}"
    print(s.format(**turk_rep))

Proqramı skriptdə yazın və icra edin.

format metodunda lokal dəyişən adlarının istifadəsi

Python proqramlaşdırma dilində locals() adlı daxili bir funksiya var. Bu funksiya cari təsir sahəsinin lokal dəyişənləri və onların qiymətlərindən ibarət lüğəti qaytarır. Lokal dəyişənlərin adları lüğətin açarları, bu dəyişənlərin müvafiq qiymətləri isə açarların qiymətləri olur.
Aşağıdakı nümunəni nəzərdən keçirək:

>>> a = 11
>>> b = 22
>>> def f(): return 33

>>> locals()
{'b': 22, '__name__': '__main__', '__spec__': None, 'a': 11, 'f': <function f at 0x105654620>, '__package__': None, '__doc__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__builtins__': <module 'builtins' (built-in)>}
>>>

Biz locals() funksiyasının qaytardığı lüğətdən format metodunun parametri kimi istifadə edə bilərik:

>>> print("a={a}, b={b}, f={f}".format(**locals()))
a=11, b=22, f=<function f at 0x105654620>
>>>

Çıxışların formatlaşdırılması məqsədilə string sinfində digər sətir metodları da nəzərdə tutulmuşdur. Həmin metodlarla müvafiq bölmədə tanış ola bilərsiniz.