Metoda formatiranja stringa

6.9.6 Metoda formatiranja stringa

Prvo nam fali neko malo predznanje koje će ti se kasnije višestruko isplatiti.
Naime, u par navrata sam ti rekao da su stringovi objekti, i verovatno ti je ta reč izašla i na uši i na nos, i pri tom ti se diže kosa na glavi kada je čuješ, ali, moraću da preskočim taj tvoj subjektivni osećaj nemoći i straha pred NLO-om (mislim na neindentifikovanu lingvističku odrednicu hehehe).
Zašto bi ti to uopšte išta značilo?
Za sad, znači ti samo jedna informacija iz toga: Objekti mogu imati svoje metode (Ovo je još veći NLO, zar ne?).Šta su metode? Metode nisu ništa drugo nego funkcionalnosti koje neki objekat može da ima. Primer u stvarnom životu bi bio – frižider! Njegova funkcija je da hladi, naše je da podesimo na koliko stepeni!
Jeste... Pobogu... Pređi na stvar... Inače ćeš osetiti metodu mojih gasova, koji imaju funkcionalnost da trenutno prekinu ovaj tutorijal.
Odličan primer, no ne plašim se... Nisam menjao čarape mesec dana! Njihova metoda je da te drže omamljenim i mirnim tokom učenja! Evo, oseti, sad ću da ih dignem tu na sto, baš pored tastature....
Ok, sada kada si shvatio šta su metode, da vidimo zašto nam je to ovde uopšte i važno.
Ponekad želimo da kreiramo stringove od nekih drugih informacija. Svi dosadašnji pokušaji su ili nepraktični, ili mogu da izazivaju greške.
Zato su stringovi opremljeni sa metodom koja se naziva format, koja bi ti na ovom mestu koristila.
Ali kako se metode koriste? Daj da vidimo primer:
>>> sad = 'sedim' 
>>> sutra = 'lezim' 
>>> print('Danas {0}, sutra {1}'.format(sad, sutra)) 
Danas sedim, sutra lezim 
>>> 
Šta je bre ovo?
Čekaj neki drugi primer da ti smislim.... Neću koristiti print i slično....
>>> šablon = "{0} ima rep!"
>>> šablon.format('Konj')
'Konj ima rep!'
>>> šablon.format('Magarac')
'Magarac ima rep!'
>>> šablon.format('Mačka')
'Mačka ima rep!'
>>> šablon.format('Miš')
'Miš ima rep!'
>>> 
Jel sad imalo jasnije?
Ne....
U ovom primeru sam uradio isto što i u prethodnom, samo što sam obrnuo uloge promenljivih. Prvo sam promenljivoj šablon dodelio vrednost nekog stringa.  
Unutar stringa mi možemo da koristimo nekoliko različitih oznaka koje služe kao model za formatiranje. Jednostavnije rečeno, sa posebnom oznakom mi smo „obeležili“ mesto u stringu gde želimo da ubacimo neki drugi string. I te oznake unutar stringa su vitičaste zagrade ({}).
Samo ako string sadrži ta specifična „obeležja“ možemo pozvati format metodu da zameni ta „obeležja“ sa odgovarajućim vrednostima prosleđenim format metodi u zagradama. Što smo na kraju i uradili!
U prvom primeru je slično, samo smo željene stringove dodelili promenljivima, pa onda te promenljive prosledili format metodi nekog stringa.
Obratiti pažnju na taj prvi primer: u njemu smo koristili {0}, koju će da zameni vrednost promenljive sad, koja je prva navedena u zagradi unutar format metode. Slično tome, druga specifikacija je {1} što će biti zamenjeno vrednošću promenljive sutra koja je druga navedena u zagradi u format metodi. Iako je u ovom trenutku čudno za napomenu, ali ti si trenutno naučio jednu od najvažnijih stvari, a to je da Python počinje brojanje od 0, što znači da prva pozicija ima indeks 0, druga pozicija ima indeks 1, i tako dalje. Kasnije će biti bar 100 mesta u kojima ćemo ovo ponoviti.
Ako ti je ovo brojanje teško da shvatiš, za sad ti Python daje ekstra šansu - brojevi u vitičastim zagradama su opcionalni, tako da isti ovaj primer može da izgleda i ovako:
>>> sad = 'sedim' 
>>> sutra = 'lezim' 
>>> print('Danas {}, sutra {}'.format(sad, sutra)) 
Danas sedim, sutra lezim 
>>> 
 Ali, hej... Pogledaj ovo! Brojevi mogu biti veoma korisni:
>>> "Danas {0}, sutra {0}, prekosutra {0}... Na kraju ipak {1}".format(sad, sutra) 
'Danas sedim, sutra sedim, prekosutra sedim... Na kraju ipak lezim' 
>>> 
Bez brojeva smo u „neobranom grožđu“:
>>> "Danas {}, sutra {}, prekosutra {}... Na kraju ipak {}".format(sad, sutra)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: tuple index out of range
>>> 
Greška se javlja zato što Python očekuje da u format metodi mi zadamo onoliko vrednosti, koliko je potrebno da se zameni specifikacija u stringu (drugim rečima, za svaku predviđenu oznaku unutar stringa očekuje po jednu vrednost u zagradi unutar format metode).
Takođe, razmisli o ovom zanimljivom primeru:
>>> '{} : {}'.format(11, 23) 
'11 : 23' 
>>> 
Šta je ovde zanimljivo? Pa obrati pažnju! Mi smo u string „ubacili“ brojeve! Sasvim drugi tip podataka! Znači, sad ne treba da nas brine da li je nešto string ili ne, mi to možemo putem format metode prikazati u našoj poruci!
Ali, u retkim prilikama moramo i da uključimo mozak. Šta ako želimo da unutar formatiranog stringa imamo – vitičastu zagradu? Hmmm:
>>> '{{} : {}}'.format(11, 23) 
Traceback (most recent call last): 
  File "<stdin>", line 1, in <module> 
ValueError: Single '}' encountered in format string 
>>> 
Ajd da probamo {{ možda pomogne:
>>> '{{{} : {}}}'.format(11, 23) 
'{11 : 23}' 
>>> 
Ovako je već bolje. Primeti „trik“: samo sam duplirao vitišastu zagradu koja treba da bude prikazana korisniku, kako je Python ne bi smatrao oznakom koju treba da zameni sa nečim.
Napomena: Ovo gornje važi samo za stringove koji su predviđeni za formatiranje (šabloni i slično). Vitičaste zagrade unutar „običnog“ stringa su samo  - vitičaste zagrade!
>>> string = '{}' 
>>> print(string) 
{} 
>>> string 
'{}' 
>>> 
Ali vratimo se mi formatiranju....
Znači sve što Python radi u format metodi je da zameni svaku prosleđenu vrednost na specifično mesto u stringu. Ali, mi možemo koristiti i znatno detaljnije specifikacije, koje najbolje mogu opisati slikovito:
{broj : specifikacija}
Pa tako, na primer, možemo da koristimo decimalne brojeve u tekstu:
>>> šablon = '{0:.2}' 
>>> šablon.format(1/3) 
'0.33' 
>>> šablon.format(1/6) 
'0.17' 
>>> šablon.format(0.158979) 
'0.16' 
>>> 
Vidiš kako smo definisali šablon? Iza broja smo stavili dvotačku koja Pythonu govori „sada dolazi opis kako“. Pošto želimo da bude prikazan decimalni broj oznaka je – tačka (znači jednostavno „prikaži ovaj broj sa tačkom), a potom smo stavili broj koji Pythonu govori na koliko mesta iza tačke da zaokruži broj. Potom smo pozvali format metodu sa željenim brojevima. Lako?
A, možda želimo da imamo i neku kontrolu kako nam se sam tekst prikazuje na ekranu? Želimo da bude centriran? Ili  da bude ulevo, ili udesno... Da zauzima određen broj mesta na ekranu?
>>> levo = '{:<15>>> desno = '{:>15}' 
>>> sredina = '{:^15}' 
>>> levo.format('Jupi!') 
'Jupi!          ' 
>>> desno.format('Jupi!') 
'          Jupi!' 
>>> sredina.format('Jupi!') 
'     Jupi!     ' 
>>> 
Vidimo da je sintaksa slična kao kada želimo da prikažemo decimalne brojeve. Opet imamo dvotačku (u ovom primeru nisam koristio broj za „poziciju“, jer sam samo prosleđivao po jednu vrednost u format metodi). Posle te dvotačke sam naveo oznaku koja govori Pythonu gde da prikaže (<, ^, > - levo, centrirano, desno) i posle toga sam prosledio broj koji Pythonu govori koliko mesta na ekranu je rezervisano za ovaj string. 
A šta ako želim da okružim neki tekst sa nekim znakovima?
>>> tekst = 'Jupi!' 
>>> '{:_^15}'.format(tekst) 
'_____Jupi!_____' 
>>> '{:#^15}'.format(tekst) 
'#####Jupi!#####' 
>>> '{:1>15}'.format(tekst) 
'1111111111Jupi!' 
>>> '{:@^15}'.format(tekst) 
'@@@@@Jupi!@@@@@' 
>>> 
Vau, samo sam pre oznake za poziciju napisao znak kojim želim da „okružim“ string. Lako, zar ne?
Postoje i još različitih specifikacija koje se mogu koristiti prilikom formatiranja stringova, ali ostalo je nešto, što smo ovde videli, što naprosto „bode oči“. Naime, format metodu smo uveli da bi smo smanjili mogućnost pojave grešaka u našem programu, a videli smo da, ukoliko ne koristimo pozicione brojeve (primer za pozicione brojeve  koji nam omogućavaju više moći '{0}, {1} je {0}') možemo lako da izazovemo da program postane nefunkcionalan.
Možda da imamo neki podsetnik, koji nam neće dati da zaboravimo šta treba da stavimo u string?
>>> '{0:@^15}: {1:_>15}'.format(tekst, 'huh') 
'@@@@@Jupi!@@@@@: ____________huh' 
>>> '{sredina:@^15}: {desno:_>15}'.format(sredina = tekst, desno = 'huh') 
'@@@@@Jupi!@@@@@: ____________huh' 
>>> '{ime} je {opis}, zato što je {ime}'.format(ime = 'Konj', opis = 'Magarac') 
'Konj je Magarac, zato što je Konj' 
>>> '{0} je {1}, zato što je {0}'.format('Konj', 'Magarac') 
'Konj je Magarac, zato što je Konj' 
>>> 
Što ti govori šta? Možeš jednostavno unutar opisa kako se formatira koristiti neku promenljivu, koju si definisao u tom trenutku, ne ranije – ona služi samo za formatiranje stringa (npr. {ime}), a zatim se format metodi prosleđuje vrednost tako što se direktno dodeljuje toj promenljivoj (npr ime = 'Joj'). Ovakav način rada se zove formatiranje ključnim rečima!
Možda deluje konfuzno, ali isprobavaj malko ovo u interaktivnom promptu, pa će da ti bude jasnije.
E sad... Mi uvek imamo više rešenja u „rukavu“, zar ne? Pri programima koji nisu baš toliko zahtevni da nešto lepo i krasno prikažu korisnicima, programeri pribegavaju „triku“ koji može da služi sličnoj svrsi kao i format....
Ako si dobro video i pročitao:
>>> help(print) 
print(...) 
    print(value, ..., sep=' ', end='\n', file=sys.stdout) 
    
    Prints the values to a stream, or to sys.stdout by default. 
    Optional keyword arguments: 
    file: a file-like object (stream); defaults to the current sys.stdout. 
    sep:  string inserted between values, default a space. 
    end:  string appended after the last value, default a newline. 
(END) 
Obrati pažnju na sep i end! Mi mоžemo kontrolisati šta će biti prikazano na ekranu pomoću ovih „odrednica“. sep -to je znak koji je separator više vrednosti koje prosleđujemo print-u, end – to je znak koji će print staviti na kraju svog rada (znači na kraj reda).
Hajd da razjasnimo ovo:
>>> print("jabuke", "i", "vino", sep = "_#_") 
jabuke_#_i_#_vino 
>>> 
(Ups... Zamenili smo razmake između reči sa nečim drugim...)
Ili....
>>> print("jabuke", "i", "vino", sep = "_#_", end = "$$$$"); print("i", "šuplji", "zubi") 
jabuke_#_i_#_vino$$$$i šuplji zubi 
>>> 
Ovde smo rekli funkciji print da ne ode u novi red, već da prikaže $$$$ i stane, a zatim je sledeći print nastavio od tog mesta na ekranu....
Vežba, vežba.... Samo gimnastika mozga će te ovo naučiti.... A ovo su prilično jednostavne i banalne stvari....
Ali mi imamo još toga da pričamo o stringovima, pre nego što odemo na nešto „ozbiljnije“!

6.9.5 Koncentracija
stringova
Indeks 6.9.7 Specijalni
znakovi

Primjedbe

Popularno ovog meseca

Gde pronaći novosti sa facebook stranica nakon velike promene koja ga je zadesila?

Dva načina da vratite svoj Windows 10 na fabričke vrednosti

Kako preuzeti video koji je neko postavio na facebook-u bez upotrebe dodatnih programa?

Više neće biti moguć besplatan prelazak na Windows 10

Prijateljski meč ŠK "Titel" - ŠK "Bukovac"

Kako manipulisati Windows licencom pomoću slmgr komande?

Tu je novi Qt creator 4.4.0!

Fake poet

Da li je poželjno biti anoniman na internetu (ili se predstavljati punim imenom i prezimenom)?

Kosmička era može da počne! 10, 9, 8, 7.... Naravno, pre 60 godina...