Muotoiltu tulostaminen f-merkkijonoilla tai str.format-funktiolla

Tähän asti olemme käyttäneet print-funktiota tulostamiseen varsin suoraviivaisesti:

alkuaine = "C"
atomipaino = 12.011
print("Alkuaineen", alkuaine, "atomipaino on", atomipaino)

tulostaa

Alkuaineen C atomipaino on 12.011

f-merkkijonot

Pythonissa on myös edistyneempiä tapoja tulostaa muotoiltuja merkkijonoja. Pythonin versiosta 3.6 lähtien on ollut mahdollista hyödyntää ns. f-merkkijonoja (engl. f-strings), joilla muuttujien arvojen sijoittaminen merkkijonoihin on erittäin helppoa:

alkuaine = "C"
atomipaino = 12.011
# Huomaa, miten print-lausekkeen sisällä oleva merkkijono alkaa f-kirjaimella ennen lainausmerkkiä
print(f"Alkuaineen {alkuaine} atomipaino on {atomipaino}")

tulostaa

Alkuaineen C atomipaino on 12.011

f-merkkijonoja käytettäessä muuttujat voidaan siis upottaa merkkijonon sisään {muuttuja}-merkinnällä. 

str.format-funktio

Ennen f-merkkijonoja muotoiltuun tulostamiseen käytettiin str.format-funktiota:

alkuaine = "C"
atomipaino = 12.011
print("Alkuaineen {} atomipaino on {}".format(alkuaine, atomipaino))

tulostaa

Alkuaineen C atomipaino on 12.011

Merkkijonon "Alkuaineen {} atomipaino on {}" kaarisulut korvautuivat siis format-funktion parametreilla alkuaine ja atomipaino. On makuasia, käyttääkö f-merkkijonoja vai str.format-funktiota. f-merkkijonoilla koodista tulee yleensä selkeämpää ja tämän kurssin oppimateriaaleissa käytetään pääasiassa f-merkkijonoja.

{}-kentän muotoilu

f-merkkijonojen {muuttuja}-kenttää voi muotoilla lukuisilla eri tavoilla. Sen tyypillisin käyttötapa on {muuttuja:<leveys>.<tarkkuus><tyyppi>}

Kentän tyyppiä merkitään kirjaimella. Tällä kurssilla tärkeimpiä kentän tyyppejä ovat

  • liukuluku f
  • kokonaisluku d
  • merkkijono s

Esimerkkejä:

  • liukuluku pyöristettynä kolmen desimaalin tarkkuuteen, automaattinen kentän leveys: {muuttuja:.3f}
  • liukuluku, 6 merkkiä leveä kenttä, pyöristettynä nollan desimaalin tarkkuuteen: {muuttuja:6.0f}
  • kokonaisluku, automaattinen kentän leveys: {muuttuja:d}
  • kokonaisluku, 5 merkkiä leveä kenttä: {muuttuja:5d}
  • Merkkijono, automaattinen kentän leveys {muuttuja:s}
Esimerkki 1:

T = 300 # K
p = 1.12345 # atm
print(f"Olosuhteet ovat: {T:d} K, {p:.3f} atm")

tulostaa

Olosuhteet ovat: 300 K, 1.123 atm

Esimerkki 2:
n = 0.25          # mol
V = 0.00456       # m^3
T = 298.15        # K
R = 8.314462618   # J/(mol K)
p = n * R * T / V # Pa
print(f"Kun n = {n:7.3f} mol, V = {V:7.5f} m^3, T = {T:7.2f} K, on paine p = {p:7.0f} Pa")

tulostaa seitsemän merkkiä leveitä kenttiä (numerojonot 1234567 havainnollistavat kentän leveyttä)

Kun n =   0.250 mol, V = 0.00456 m^3, T =  298.15 K, on paine p =  135908 Pa
        1234567          1234567          1234567                 1234567

Vaikka f-merkkijonojen muotoilukenttien kokoaminen voi ensi alkuun vaikuttaa työläältä, on se todella paljon kätevämpää kuin monimutkaisten tulostusten hoitaminen  print- ja round-funktioiden avulla.

Käytä lukuarvojen tulostamiseen tästä lähtien f-merkkijonoja.

f-merkkijonojen laajempi dokumentaatio löytyy osoitteista https://docs.python.org/3/reference/lexical_analysis.html#f-strings ja https://docs.python.org/3/library/string.html#format-specification-mini-language.


Tehtävä 2.3.1.