Python-da formatın dəyişdirilməsi, format (sıfır doldurma, eksponensial qeyd, onaltılıq və s.)

Biznes

Python-da ədədi və ya sətri müxtəlif formatlara çevirmək (formatlaşdırmaq) üçün daxili funksiya formatı() və ya str.format() metodundan istifadə edin.

Bu bölmədə biz aşağıdakı funksiyalardan necə istifadə edəcəyimizi izah edəcəyik.

  • daxili funksiya (məsələn, proqramlaşdırma dilində)format()
  • sim üsulustr.format()

Bundan əlavə, aşağıdakı formata çevirmək üçün format spesifikasiyası sətri nümunə kodu ilə izah olunur.

  • Sola əsaslandırılmış, Mərkəzə əsaslandırılmış, Sağa əsaslandırılmış
  • sıfır doldurma
  • İşarə (artı və ya mənfi)
  • Rəqəm ayırıcı (vergül, alt xətt)
  • İkilik, səkkizlik və onaltılıq ədədlər
  • Onluq nöqtəsindən sonra rəqəmlərin sayını göstərin
  • Əhəmiyyətli rəqəmlər (əhəmiyyətli rəqəmlərin sayı)
  • eksponensial qeyd
  • Faiz göstəricisi

Qeyd edək ki, Python 3.6-dan bəri str.format() sətir metoduna daha yığcam olması üçün f-sətirləri (f-sətirləri) əlavə edilmişdir.

Daxili funksiya: format()

format() standart Python daxili funksiyası kimi təqdim olunur.

Kontur aşağıdakı kimidir.

  • format(value, format_spec)
    • Birinci arqument: thevalue
      Orijinal dəyər. String str, number int, float və s.
    • İkinci arqumentformat_spec
      Format spesifikasiyası sətri. String küç
    • Qaytarılan dəyər: formatlanmış sətir str

Nümunələr aşağıda göstərilmişdir. Format sətirlərinin növləri və onların necə yazılması daha sonra təsvir edilir.

Bu misalda biz ilk arqument kimi ədədi hərflərdən və sətir literallarından istifadə etdik, lakin təbii ki, siz bu dəyərləri ehtiva edən dəyişənlərdən istifadə edə bilərsiniz.

s = format(255, '04x')
print(s)
print(type(s))
# 00ff
# <class 'str'>

print(format('center', '*^16'))
# *****center*****

String metodu str.format()

Sətir str növü üçün format() metodu da var.

Format() metodunu çağıran str sətirindəki {} əvəzetmə sahəsi adlanır və format() metodunun arqumenti ilə əvəz olunur.

Format spesifikasiyası sətri əvəzetmə sahəsində {} və sonra “:” ilə yazılmalıdır.

Qaytarılan dəyər formatlanmış sətirdir.

Yuxarıda təsvir edilən daxili funksiya formatına() ekvivalent proses aşağıdakı kimidir.

s = '{:04x}'.format(255)
print(s)
print(type(s))
# 00ff
# <class 'str'>

print('{:*^16}'.format('center'))
# *****center*****

Yenə də biz arqumentlər kimi ədədi hərflərdən və sətir literallarından istifadə edirik, lakin təbii ki, dəyişənlər də məqbuldur.

Əvəzetmə sahələri üçün arqumentlərin təyin edilməsi

Arqumentləri sıra ilə göstərin (defolt)

Çoxsaylı əvəzetmə sahələri {} ola bilər və defolt olaraq metod arqumentləri ardıcıllıqla işlənir. {} formatında spesifikasiya sətri buraxılıbsa, o, sadəcə olaraq str() ilə sətirə çevriləcək.

Dəyişən dəyərləri sətirə daxil etmək və onları çap etmək üçün faydalıdır.

print('{}-{}-{}'.format('100', '二百', 300))
# 100-二百-300

Tam ədədlər üçün mövqe arqumentini təyin edin

{0} və ya {1} kimi {}-də tam dəyər göstərilibsə, çıxış arqumentlərin sırasından asılı olacaq. Eyni nömrə təkrar istifadə edilə bilər. Bu, eyni dəyəri sətirə daxil etmək istədiyiniz zaman faydalıdır.

print('{0}-{1}-{0}'.format('foo', 'bar'))
# foo-bar-foo

İxtiyari adlar (sətirlər) üçün açar söz arqumentlərini təyin edin

Siz həmçinin {}-də istənilən adı göstərə və onu açar söz arqumenti kimi daxil edə bilərsiniz.

print('{day}/{month}/{year}/'.format(day=11, month=1, year=2018))
# 11/1/2018

Siyahı və ya lüğəti arqument kimi göstərin

Siyahılar və lüğətlər arqument kimi göstərilə bilər.

Əvəzetmə sahəsində siyahının indeksini və ya lüğətin açarını təyin etmək üçün [] istifadə edin. Qeyd edək ki, “‘” və “” dırnaq işarələri lüğət açarlarını təyin etmək üçün istifadə edilmir.

Eyni arqumentdən təkrar istifadə etmək istəyirsinizsə, yuxarıda təsvir olunduğu kimi tam dəyər və ya sətir (ad) təyin etməlisiniz.

l = ['one', 'two', 'three']
print('{0[0]}-{0[1]}-{0[2]}'.format(l))
# one-two-three

d1 = {'name': 'Alice', 'age': 20}
d2 = {'name': 'Bob', 'age': 30}
print('{0[name]} is {0[age]} years old.\n{1[name]} is {1[age]} years old.'.format(d1, d2))
# Alice is 20 years old.
# Bob is 30 years old.

Siyahıya * əlavə edərək onu arqument kimi göstərərək mövqeli arqument kimi və ya lüğətə ** əlavə edib arqument kimi göstərməklə açar söz arqumenti kimi genişləndirmək olar.

l = ['one', 'two', 'three']
print('{}-{}-{}'.format(*l))
# one-two-three

d = {'name': 'Alice', 'age': 20}
print('{name} is {age} years old.'.format(**d))
# Alice is 20 years old.

Buruq mötərizələrin təsviri {}

Format() metodunda qıvrımlı mötərizələri {,} yazmaq istəyirsinizsə, bunu {{,}} kimi iki dəfə təkrarlayın. Nəzərə alın ki, əks xətlərdən qaçmaq mümkün deyil.

print('{{}}-{num}-{{{num}}}'.format(num=100))
# {}-100-{100}

formatlanmış sətir

Hər iki halda formatı təyin etmək üçün {}-də tam dəyər və ya ad sətirindən sonra “:format sətri” yazın.

print('{num:x}'.format(num=255))
# ff

print('{day}/{month:02}/{year:02}/'.format(day=11, month=1, year=2018))
# 11/01/2018

Aşağıda format sətirindən istifadə edərək formatı necə təyin edəcəyimizi izah edəcəyik. Nümunə kodu str.format() metodundan istifadə edir, lakin eyni formatlı sətir daxili funksiya formatı () ilə istifadə edilə bilər. Daxili funksiya formatında() format spesifikasiyası sətri ikinci arqument kimi müəyyən edilir.

Sola əsaslandırılmış, Mərkəzə əsaslandırılmış, Sağa əsaslandırılmış

Aşağıda sola əsaslandırılmış, mərkəzə əsaslanmış, sağa əsaslanmış və s.-ni uyğunlaşdıra bilərsiniz. Simvolların ümumi sayını rəqəm kimi göstərin.

  • <
  • ^
  • >
print('left  : {:<10}'.format(100))
print('center: {:^10}'.format(100))
print('right : {:>10}'.format(100))
# left  : 100       
# center:    100    
# right :        100

Siz həmçinin doldurulacaq simvolu təyin edə bilərsiniz. Əgər buraxılmışsa, yuxarıdakı misalda olduğu kimi, o, boşluqdur.

Tək simvol olduğu müddətcə iki baytlıq simvollardan istifadə edə bilərsiniz.

print('left  : {:*<10}'.format(100))
print('center: {:a^10}'.format(100))
print('right : {:鬼>10}'.format(100))
# left  : 100*******
# center: aaa100aaaa
# right : 鬼鬼鬼鬼鬼鬼鬼100

&gt ilə sağa əsaslandırma; (-,+) işarəsini nəzərə almır. Əgər = istifadə etsəniz, işarədən sonra müəyyən edilmiş simvol gəlir. + təyin etmək istəyirsinizsə, = sonra + yazın. İşarənin işlənməsinin təfərrüatları daha sonra təsvir olunacaq.

print('sign: {:0>10}'.format(-100))
print('sign: {:0=10}'.format(-100))
print('sign: {:0=+10}'.format(100))
# sign: 000000-100
# sign: -000000100
# sign: +000000100

<, ^ və > sətirlər üçün təyin oluna bilər, lakin = ValueError xətası ilə nəticələnəcək. Əgər sətir üçün = istifadə etmək istəyirsinizsə, onu int() istifadə edərək rəqəmə çevirməlisiniz.

# print('sign: {:0=10}'.format('-100'))
# ValueError: '=' alignment not allowed in string format specifier

print('sign: {:0=10}'.format(int('-100')))
# sign: -000000100

Eyni şey üzən nöqtəli nömrələrə də aiddir. Ondalıq xallar da simvol kimi sayılır.

print('left  : {:*<10}'.format(1.23))
print('center: {:a^10}'.format(1.23))
print('right : {:鬼>10}'.format(1.23))
# left  : 1.23******
# center: aaa1.23aaa
# right : 鬼鬼鬼鬼鬼鬼1.23

print('sign: {:0>10}'.format(-1.23))
print('sign: {:0=10}'.format(-1.23))
print('sign: {:0=+10}'.format(1.23))
# sign: 00000-1.23
# sign: -000001.23
# sign: +000001.23

Siyahılar, dəstlər və s. olduğu kimi göstərildiyi təqdirdə xətaya səbəb olacaq və str() istifadə edərək sətirlərə çevrilə bilər.

l = [0, 1]
print(type(l))
# <class 'list'>

# print('{:*^16}'.format(l))
# TypeError: unsupported format string passed to list.__format__

print(type(str(l)))
# <class 'str'>

print('{:*^16}'.format(str(l)))
# *****[0, 1]*****

Sola əsaslandırılmış, mərkəzə əsaslandırılmış və sağa əsaslandırılmış üçün ljust(), center() və rjust() adlı xüsusi sətir metodları da mövcuddur.

0 doldurun

Rəqəmlərin sayını sıfır doldurmaqla tənzimləmək istəyirsinizsə, doldurulacaq simvolu 0-a təyin edin və onu sağa doğru əsaslandırın.

Sıfır doldurulma vəziyyətində, düzləşdirmə simvolu buraxılıbsa, = göstərildiyi kimi işlənir.

print('zero padding: {:0=10}'.format(100))
print('zero padding: {:010}'.format(100))
# zero padding: 0000000100
# zero padding: 0000000100

print('zero padding: {:0=10}'.format(-100))
print('zero padding: {:010}'.format(-100))
# zero padding: -000000100
# zero padding: -000000100

#ERROR!

# print('zero padding: {:010}'.format('-100'))
# ValueError: '=' alignment not allowed in string format specifier

Sıfır doldurma üçün zfill() adlı xüsusi sətir metodu da var.

İşarə (artı və ya mənfi)

Varsayılan olaraq, yalnız mənfi ədədlər işarə ilə qeyd olunur (minus-).

Formatlama spesifikasiyası sətirinə + əlavə edildikdə, müsbət ədədlər üçün də işarə (plus +) göstərilir. Boşluq əlavə olunarsa, müsbət ədədin əvvəlində boşluq göstərilir və rəqəmlərin sayı mənfi ədədə uyğunlaşdırılır.

print('sign: {}'.format(100))
print('sign: {}'.format(-100))
# sign: 100
# sign: -100

print('sign: {:+}'.format(100))
print('sign: {:+}'.format(-100))
# sign: +100
# sign: -100

print('sign: {: }'.format(100))
print('sign: {: }'.format(-100))
# sign:  100
# sign: -100

Yuxarıda qeyd olunan sıfır doldurma kimi ixtiyari simvollarla doldurarkən diqqətli olun. Defolt, + və boşluq olmadan müsbət ədədləri daha bir simvolla doldurur.

print('sign: {:06}'.format(100))
print('sign: {:06}'.format(-100))
# sign: 000100
# sign: -00100

print('sign: {:+06}'.format(100))
print('sign: {:+06}'.format(-100))
# sign: +00100
# sign: -00100

print('sign: {: 06}'.format(100))
print('sign: {: 06}'.format(-100))
# sign:  00100
# sign: -00100

Hizalanma simvolundan istifadə edilərsə, işarə təyini simvolu düzləşdirmə simvolundan sonra yazılmalıdır.

print('sign: {:_>6}'.format(100))
print('sign: {:_>6}'.format(-100))
# sign: ___100
# sign: __-100

print('sign: {:_>+6}'.format(100))
print('sign: {:_>+6}'.format(-100))
# sign: __+100
# sign: __-100

print('sign: {:_> 6}'.format(100))
print('sign: {:_> 6}'.format(-100))
# sign: __ 100
# sign: __-100

Rəqəm ayırıcı (vergül, alt xətt)

Hər üç rəqəmə vergül və ya alt xətt _ ayırıcı əlavə edin. Bu, böyük rəqəmləri oxumağı asanlaşdırır. Qeyd edək ki, alt xətt_ Python 3.6-da əlavə edilmiş seçimdir, ona görə də əvvəlki versiyalarda istifadə edilə bilməz.

print('{:,}'.format(100000000))
# 100,000,000

print('{:_}'.format(100000000))
# 100_000_000

Üzən nöqtəli nömrəli float tiplərində yalnız tam hissə ayrılır.

print('{:,}'.format(1234.56789))
# 1,234.56789

İkilik, səkkizlik və onaltılıq ədədlər

Çıxış üçün ədədi dəyərləri ikilik, səkkizlik və onaltılıq ədədlərə çevirir.

  • b: İkili
  • o: səkkizlik
  • d: Ondalık
  • x,X: Hexadecimal (böyük hərflər böyük hərflə yazılır)
print('bin: {:b}'.format(255))
print('oct: {:o}'.format(255))
print('dec: {:d}'.format(255))
print('hex: {:x}'.format(255))
print('HEX: {:X}'.format(255))
# bin: 11111111
# oct: 377
# dec: 255
# hex: ff
# HEX: FF

O, həmçinin 0-doldurma ilə birləşdirilə bilər və tez-tez ikili və onaltılıq notasiyada rəqəmləri uyğunlaşdırmaq üçün istifadə olunur.

print('bin: {:08b}'.format(255))
print('oct: {:08o}'.format(255))
print('dec: {:08d}'.format(255))
print('hex: {:08x}'.format(255))
print('HEX: {:08X}'.format(255))
# bin: 11111111
# oct: 00000377
# dec: 00000255
# hex: 000000ff
# HEX: 000000FF

Qeyd edək ki, sıfır doldurma simvollarının sayı prefiks nəzərə alınmaqla göstərilməlidir.

print('bin: {:#010b}'.format(255))
print('oct: {:#010o}'.format(255))
print('dec: {:#010d}'.format(255))
print('hex: {:#010x}'.format(255))
print('HEX: {:#010X}'.format(255))
# bin: 0b11111111
# oct: 0o00000377
# dec: 0000000255
# hex: 0x000000ff
# HEX: 0X000000FF

İkilik və onaltılıq ədədlər üçün yalnız alt xətt _ rəqəm ayırıcısı daxil edilə bilər (Python 3.6 və ya daha sonra). 4-rəqəmli separator istifadə olunur; sıfırla doldurulmuş simvolların sayı alt xəttlərin sayını da nəzərə almalıdır.

print('hex: {:08x}'.format(255))
print('hex: {:09_x}'.format(255))
print('hex: {:#011_x}'.format(255))
# hex: 000000ff
# hex: 0000_00ff
# hex: 0x0000_00ff

Yalnız tam tipli int formatı ikili və ya onaltılıq sistemə çevirə bilər. Onu rəqəmə çevirmək üçün int() istifadə edə bilərsiniz.

# print('hex: {:08x}'.format('255'))
# ValueError: Unknown format code 'X' for object of type 'str'

print('hex: {:08x}'.format(int('255')))
# hex: 000000ff

Onluq nöqtəsindən sonra rəqəmlərin sayını göstərin

Onluq nöqtəsindən sonra rəqəmlərin sayını təyin etmək üçün aşağıdakıları edin: n rəqəmlərin sayıdır. Onluq nöqtəsindən sonrakı rəqəmlərin sayı tam hissədəki rəqəmlərin sayından asılı olmayaraq göstərilən rəqəm sayına çevrilir.
.[n]f

print('{:.2f}'.format(123.456))
print('{:.5f}'.format(123.456))
print('{:.3f}'.format(0.0001234))
# 123.46
# 123.45600
# 0.000

Onluq nöqtənin sol tərəfi yuxarıda göstərildiyi kimi sola əsaslandırılmış, mərkəzə əsaslandırılmış, sağa əsaslandırılmış və ya sıfırla doldurulmuş kimi göstərilə bilər. Hədəf dəyərinin rəqəmlərinin sayı göstərilən rəqəmdən çox olarsa, heç bir şey edilmir. Hədəf dəyərindəki rəqəmlərin sayı göstərilən rəqəmlərdən çox olarsa, heç bir şey edilmir.

print('{:>12.5f}'.format(123.456))
print('{:012.5f}'.format(123.456))
print('{:06.5f}'.format(123.456))
#    123.45600
# 000123.45600
# 123.45600

Əgər onluq nöqtədən sonra rəqəmlərin orijinal sayından az rəqəmlər göstərsəniz, dəyər yuvarlaqlaşdırılacaq. Qeyd edək ki, bu, ən yaxın tam ədədə yuvarlaqlaşdırma deyil, cüt ədədə, məs. 0.5 0-a yuvarlaqlaşdırılır.

print('{:.0f}'.format(0.4))
print('{:.0f}'.format(0.5))
print('{:.0f}'.format(0.6))
# 0
# 0
# 1

Əgər ümumi yuvarlaqlaşdırmadan istifadə etmək istəyirsinizsə, standart kitabxananın ondalığı üçün quantize() metodundan istifadə edə bilərsiniz.

eksponensial qeyd

Üzən nöqtəli float nömrəsi str sətrinə çevrildikdə, rəqəmlərin sayından asılı olaraq avtomatik olaraq eksponensial notasiyada yazılacaq. Tam ədəd növü int yoxdur.

print('{}'.format(0.0001234))
print('{}'.format(0.00001234))
# 0.0001234
# 1.234e-05

print('{}'.format(1234000000000000.0))
print('{}'.format(12340000000000000.0))
print('{}'.format(12340000000000000000000000))
# 1234000000000000.0
# 1.234e+16
# 12340000000000000000000000

Formatlama spesifikasiyası sətirində e və ya E təyin etsəniz, həmişə eksponensial nota çevirə bilərsiniz. Çıxışda istifadə olunan simvollar müvafiq olaraq e və E olacaq.

print('{:e}'.format(0.0001234))
print('{:E}'.format(0.0001234))
# 1.234000e-04
# 1.234000E-04

Onluq nöqtəsindən sonra rəqəmlərin sayını təyin etmək də mümkündür. Tam hissə həmişə bir rəqəm olacaq və ondalık nöqtəsi göstərilən rəqəmlərin sayı olacaqdır.

print('{:.5e}'.format(0.0001234))
print('{:.2E}'.format(0.0001234))
# 1.23400e-04
# 1.23E-04

print('{:.5e}'.format(987.65))
print('{:.2E}'.format(987.65))
# 9.87650e+02
# 9.88E+02

Nəzərə alın ki, sola əsaslandırılmış, mərkəzə əsaslandırılmış, sağa əsaslandırılmış və ya sıfırla doldurulmuş qeyd etsəniz, e-, E+ və s. də rəqəmlər (simvollar) kimi hesablanacaq.

print('{:>12.5e}'.format(987.65))
print('{:012.2E}'.format(987.65))
#  9.87650e+02
# 00009.88E+02

Əhəmiyyətli rəqəmlər (əhəmiyyətli rəqəmlərin sayı)

Siz aşağıdakıları etməklə rəqəmlərin ümumi sayını təyin edə bilərsiniz Nəticədən asılı olaraq eksponensial qeyd avtomatik olaraq istifadə olunacaq. Nəzərə alın ki, onluq nöqtədən sonra gələn sıfırlar buraxılacaq.
.[n]g

print('{:.2g}'.format(123.456))
print('{:.3g}'.format(123.456))
print('{:.8g}'.format(123.456))
print('{:.3g}'.format(0.0001234))
# 1.2e+02
# 123
# 123.456
# 0.000123

Əgər g buraxsanız, nəticə tam ədəd olmayacaq. g əksər hallarda eynidir, ancaq çıxışın tam olduğu hallarda.

print('{:.2}'.format(123.456))
print('{:.3}'.format(123.456))
print('{:.8}'.format(123.456))
print('{:.3}'.format(0.0001234))
# 1.2e+02
# 1.23e+02
# 123.456
# 0.000123

Eyni dəyəri emal etsək, müvafiq olaraq aşağıdakıları alırıq.

print('{:.3f}'.format(123.456))
print('{:.3e}'.format(123.456))
print('{:.3g}'.format(123.456))
print('{:.3}'.format(123.456))
# 123.456
# 1.235e+02
# 123
# 1.23e+02

print('{:.8f}'.format(123.456))
print('{:.8e}'.format(123.456))
print('{:.8g}'.format(123.456))
print('{:.8}'.format(123.456))
# 123.45600000
# 1.23456000e+02
# 123.456
# 123.456

g halında və ya buraxılıbsa, ondalık nöqtədən sonra arxadakı sıfırlar buraxılır, buna görə də eyni sayda əhəmiyyətli rəqəmləri (əhəmiyyətli rəqəmlərin sayı) çıxarmaq istəyirsinizsə, e və ya E eksponensial qeydindən istifadə edin. tam hissəsi həmişə bir rəqəmdir və onluq nöqtə göstərilən rəqəmlərin sayıdır, ona görə də n əhəmiyyətli rəqəm çıxarmaq istəyirsinizsə, sadəcə n-1-i göstərin.

print('{:.4e}'.format(123.456))
print('{:.4e}'.format(0.000012345))
print('{:.4e}'.format(12))
# 1.2346e+02
# 1.2345e-05
# 1.2000e+01

Faiz göstəricisi

Formatlama spesifikasiyası sətirində % göstərilibsə, rəqəmli float və ya int dəyəri 100-ə vurulur və % ilə sətirə çevrilir.

Onluq nöqtəsindən sonra rəqəmlərin sayını təyin etmək də mümkündür. Varsayılan olaraq, onluq nöqtədən sonra altı rəqəmdir. Sola əsaslandırma, mərkəzə əsaslandırma, sağa əsaslandırma və sıfır doldurma da mövcuddur. % də simvol kimi sayılır.

print('{:%}'.format(0.12345))
print('{:.2%}'.format(0.12345))
# 12.345000%
# 12.35%

print('{:%}'.format(10))
print('{:.2%}'.format(10))
# 1000.000000%
# 1000.00%

print('{:>7.2%}'.format(0.12345))
print('{:07.2%}'.format(0.12345))
#  12.35%
# 012.35%
Copied title and URL