Sniðumbreyting í Python, sniði (núllfylling, veldisvísismerki, sextánskur osfrv.)

Viðskipti

Til að breyta (sniða) tölu eða streng í ýmis snið í Python, notaðu innbyggt fallsnið() eða strengjaaðferðina str.format().

Í þessum hluta munum við útskýra hvernig á að nota eftirfarandi aðgerðir.

  • innbyggð aðgerð (t.d. í forritunarmáli)format()
  • strengjaaðferðstr.format()

Að auki er sniðforskriftarstrengurinn fyrir umbreytingu í eftirfarandi snið útskýrður með sýnishornskóða.

  • Vinstri-réttlátt, Miðjuréttað, Hægraréttað
  • núll fylling
  • Merki (plús eða mínus)
  • Talnaskil (komma, undirstrik)
  • Tvöfaldur, áttund og sextán tal
  • Tilgreindu fjölda tölustafa á eftir aukastafnum
  • Mikilvægar tölur (fjöldi mikilvægra tölustafa)
  • veldisvísismerki
  • Hlutfallsskjár

Athugaðu að síðan Python 3.6 hefur f-strengir (f-strengir) verið bætt við strengjaaðferðina str.format() til að gera hana hnitmiðaðri.

Innbyggð aðgerð: format()

format() er veitt sem staðlað Python innbyggð aðgerð.

Yfirlitið er sem hér segir.

  • format(value, format_spec)
    • Fyrstu rökin: thevalue
      Upprunalega gildið. Strengur str, tala int, flot o.s.frv.
    • Önnur rökinformat_spec
      Forskriftarstrengur. Strengur str
    • Skilagildi: sniðinn strengur str

Dæmi eru sýnd hér að neðan. Tegundum sniðstrengja og hvernig á að skrifa þá er lýst síðar.

Í þessu dæmi höfum við notað tölustafi og strengjabókstafi sem fyrstu rök, en auðvitað er hægt að nota breytur sem innihalda þessi gildi.

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

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

Strengjaaðferð str.format()

Það er líka til snið() aðferð fyrir strenginn str gerð.

{} í strengnum str sem kallar format() aðferðina kallast staðgengisreiturinn og kemur í stað röksemda snið() aðferðarinnar.

Sniðstilgreiningarstrengurinn ætti að vera skrifaður í staðgöngureitinn {} og síðan „:“.

Skilagildið er sniðinn strengur str.

Samsvarandi ferli við innbyggða fallsniðið() sem lýst er hér að ofan er sem hér segir.

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

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

Aftur erum við að nota tölustafi og strengjabókstafi sem rök, en auðvitað eru breytur líka ásættanlegar.

Tilgreina rök fyrir staðgöngureitum

Tilgreindu rök í röð (sjálfgefið)

Það geta verið margir staðgengisreitir {} og sjálfgefið er aðferðarrök unnin í röð. Ef sniðforskriftarstrengnum í {} er sleppt, verður honum bara breytt í streng með str().

Gagnlegt til að setja inn breytugildi í streng og prenta þau.

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

Tilgreindu stöðurök fyrir heiltölugildi

Ef heiltölugildi er tilgreint í {}, eins og {0} eða {1}, mun úttakið ráðast af röð frumbreytanna. Hægt er að nota sama númerið ítrekað. Þetta er gagnlegt þegar þú vilt setja sama gildi í streng.

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

Tilgreindu lykilorðarrök fyrir handahófskennd nöfn (strengi)

Þú getur líka tilgreint hvaða nafn sem er í {} og slegið það inn sem lykilorðarrök.

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

Tilgreindu lista eða orðabók sem rök

Hægt er að tilgreina lista og orðabækur sem rök.

Notaðu [] til að tilgreina vísitölu lista eða lykil orðabókar í staðgöngureit. Athugaðu að gæsalappir „‘“ og „“ eru ekki notaðar til að tilgreina orðabókarlykla.

Ef þú vilt nota sömu rökin ítrekað þarftu að tilgreina heiltölugildi eða streng (nafn) eins og lýst er hér að ofan.

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.

Það er hægt að stækka það sem stöðurök með því að bæta * við listann og tilgreina það sem rök, eða sem lykilorðarrök með því að bæta ** við orðabókina og tilgreina það sem rök.

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.

Lýsing á krulluðum sviga {}

Ef þú vilt skrifa krullaða sviga {,} í format() aðferðinni skaltu endurtaka það tvisvar eins og {{,}}. Athugaðu að ekki er hægt að komast undan skástrikunum.

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

sniðinn strengur

Í báðum tilfellum, til að tilgreina sniðið, skrifaðu „:format string“ á eftir heiltölugildinu eða nafnstrengnum í {}.

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

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

Hér á eftir munum við útskýra hvernig á að tilgreina sniðið með því að nota sniðstreng. Dæmiskóðinn notar strengjaaðferðina str.format(), en sama sniðstreng er hægt að nota með innbyggðu fallsniðinu(). Í innbyggðu fallsniði() er sniðforskriftarstrengurinn tilgreindur sem önnur rök.

Vinstri-réttlátt, Miðjuréttað, Hægraréttað

Þú getur stillt til vinstri, stillt í miðju, stillt til hægri, osfrv. Tilgreindu heildarfjölda stafa sem tölu.

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

Þú getur líka tilgreint staf sem á að fylla út. Ef því er sleppt, eins og í dæminu hér að ofan, er það bil.

Þú getur notað tvöfalda bæta stafi svo framarlega sem það er einn stafur.

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

Hægri réttlæting með > tekur ekki tillit til táknsins (-,+). Ef þú notar = er táknið fylgt eftir með tilgreindum staf. Ef þú vilt tilgreina +, skrifaðu + á eftir =. Nánar er fjallað um skiltavinnslu síðar.

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

<, ^, og > hægt að tilgreina fyrir strengi, en = mun leiða til villu ValueError. Ef þú vilt nota = fyrir streng þarftu að breyta því í tölu með int().

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

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

Sama gildir um flottölur. Aukastafir eru einnig taldir sem stafur.

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

Listar, tuples o.s.frv. mun valda villu ef þeir eru tilgreindir eins og þeir eru og er hægt að breyta þeim í strengi með því að nota str().

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]*****

Fyrir vinstrijustaða, miðjujustaða og hægrijustaða eru einnig sérstakar strengjaaðferðir sem kallast ljust(), center() og rjust().

0 fylla

Ef þú vilt stilla fjölda tölustafa með núllfyllingu skaltu stilla stafinn sem á að fylla út á 0 og hægri réttlæta hann.

Ef um er að ræða núllfyllingu, ef jöfnunartákninu er sleppt, er það unnið eins og = væri tilgreint.

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

#VILLA!

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

Fyrir núllfyllingu er einnig sérstök strengjaaðferð sem kallast zfill().

Merki (plús eða mínus)

Sjálfgefið er að einungis neikvæðar tölur eru merktar með tákni (mínus-).

Þegar + er bætt við sniðforskriftarstrenginn birtist tákn (plús +) einnig fyrir jákvæðar tölur. Ef bili er bætt við birtist bil í upphafi jákvæðu tölunnar og fjöldi tölustafa er samræmdur neikvæðu tölunni.

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

Vertu varkár þegar þú fyllir út með handahófskenndum stöfum, eins og núllfyllingunni sem nefnd er hér að ofan. Sjálfgefið, án + og engin bil, fyllir jákvæðar tölur með einum staf í viðbót.

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

Ef jöfnunartákn er notað, ætti táknið að vera skrifað á eftir jöfnunartákninu.

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

Talnaskil (komma, undirstrik)

Bættu við kommu eða undirstrik _ skilju á þriggja stafa tölu. Þetta gerir stórar tölur auðveldari að lesa. Athugaðu að underscore_ er valkostur sem bætt er við í Python 3.6, svo það er ekki hægt að nota hann í fyrri útgáfum.

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

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

Þegar um er að ræða flottölutegundir með flottölum er aðeins heiltöluhlutinn afmarkaður.

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

Tvöfaldur, áttund og sextán tal

Breytir tölugildum í tvíundir, áttund og sextánda tölur fyrir úttak.

  • b: Tvöfaldur
  • o: Octal
  • d: Aukastafur
  • x,X: Sextánstafir (hástafir eru með hástöfum)
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

Það er líka hægt að sameina það með 0-fyllingu, og er oft notað til að samræma tölustafi í tvíundar- og sextánsnúmerum.

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

Athugið að tilgreina þarf fjölda núllútfyllingar með hliðsjón af forskeytinu.

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

Fyrir tvöfalda og sextánda tölu er aðeins hægt að setja inn undirstrikið _ tölustafaskil (Python 3.6 eða nýrri). Notað er fjögurra stafa skilrúm; fjöldi núllfylltra stafa verður einnig að taka tillit til fjölda undirstrikunar.

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

Aðeins heiltölugerðin int getur umbreytt sniðinu í tvíundir eða sextánda tölu. Þú getur notað int() til að breyta því í tölu.

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

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

Tilgreindu fjölda tölustafa á eftir aukastafnum

Til að tilgreina fjölda tölustafa á eftir aukastaf skaltu gera eftirfarandi: n er fjöldi tölustafa. Fjöldi tölustafa á eftir tugabroti verður tilgreindur fjöldi tölustafa óháð fjölda tölustafa í heiltöluhlutanum.
.[n]f

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

Vinstri hlið tugabrotsins er hægt að tilgreina sem vinstrijustaðan, miðjuréttaðan, hægrijustaðan eða núllútfylltan eins og lýst er hér að ofan. Ef fjöldi tölustafa markgildis er meiri en tilgreind tala er ekkert að gert. Ef fjöldi tölustafa í markgildinu er meiri en tilgreindur tölustafafjöldi er ekkert gert.

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

Ef þú tilgreinir fjölda tölustafa færri en upphaflegan fjölda tölustafa á eftir aukastafnum verður gildið námundað. Athugið að þetta er ekki námundun að næstu heilu tölu heldur að sléttri tölu, t.d. 0,5 er námundað í 0.

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

Ef þú vilt nota almenna námundun geturðu notað quantize() aðferðina fyrir staðlaða aukastaf bókasafns.

veldisvísismerki

Þegar flottölu með flottölu er breytt í streng str, þá verður hún sjálfkrafa skrifuð með veldisvísi, eftir fjölda tölustafa. Heiltala gerð int gerir það ekki.

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

Ef þú tilgreinir e eða E í forskriftarstrengnum geturðu alltaf umbreytt í veldisvísismerki. Stafirnir sem notaðir eru í úttakinu verða e og E, í sömu röð.

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

Einnig er hægt að tilgreina fjölda tölustafa á eftir aukastafnum. Heiltöluhlutinn verður alltaf einn stafur og aukastafurinn verður tilgreindur fjöldi tölustafa.

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

Athugaðu að ef þú tilgreinir vinstrijustaða, miðjujustaða, hægrijustaða eða núllútfyllta munu e-, E+ o.s.frv. einnig teljast sem tölustafir (stafir).

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

Mikilvægar tölur (fjöldi mikilvægra tölustafa)

Þú getur tilgreint heildarfjölda tölustafa með því að gera eftirfarandi. Það fer eftir niðurstöðunni, veldisvísun verður notuð sjálfkrafa. Athugaðu að núllum á eftir tugabroti verður sleppt.
.[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

Ef þú sleppir g verður úttakið ekki heil tala. g er það sama í flestum tilfellum, en aðeins í þeim tilvikum þar sem úttakið er heil tala.

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

Ef við vinnum úr sama gildi fáum við eftirfarandi í sömu röð.

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

Þegar um er að ræða g eða ef því er sleppt, er núllunum á eftir tugastafnum sleppt, þannig að ef þú vilt gefa út sama fjölda marktækra tölustafa (fjölda marktækra tölustafa), notaðu veldisvísismerki e eða E. heiltöluhluti er alltaf einn stafur og tugastafurinn er tilgreindur fjöldi tölustafa, þannig að ef þú vilt gefa út n marktæka tölustafi skaltu bara tilgreina n-1.

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

Hlutfallsskjár

Ef % er tilgreint í sniðforskriftarstrengnum er gildi talnaflotans eða int margfaldað með 100 og breytt í streng með %.

Einnig er hægt að tilgreina fjölda tölustafa á eftir aukastafnum. Sjálfgefið er sex tölustafir á eftir aukastafnum. Vinstrijusta, miðjujusta, hægrijusta og núllfyllingar eru einnig fáanlegar. % er einnig talið sem stafur.

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%