13/04/2003
I Python-verdenen er der flere måder at formatere strenge på. Moderne Python-udviklere vil ofte gribe til f-strenge (formaterede streng-literaler) for deres enkelthed og effektivitet. Men hvis du arbejder med ældre Python-kodebaser, især dem skrevet i Python 2, eller blot støder på forskellige kodestile, vil du uundgåeligt møde strengformatering ved hjælp af modulo-operatoren (%). Selvom den betragtes som en ældre metode, er den stadig fuldt funktionel i Python 3, og en grundig forståelse af den er afgørende for enhver seriøs Python-udvikler. Denne artikel vil guide dig igennem alt, hvad du behøver at vide om denne klassiske teknik.

Grundlæggende Syntaks for Modulo-formatering
De fleste kender modulo-operatoren % fra matematikken, hvor den returnerer resten af en division (f.eks. 13 % 4 er 1). Når den bruges med strenge, får den en helt ny funktion: strengformatering. Syntaksen er enkel og elegant:
<format_streng> % <værdier>
På venstre side af operatoren har vi en streng, der indeholder en eller flere pladsholdere, kendt som konverteringsspecifikatorer. Disse starter altid med et %-tegn. På højre side har vi de værdier, der skal indsættes i pladsholderne. Resultatet er en ny, formateret streng.
Lad os se på et praktisk eksempel:
print("%d %s koster %.2f kr." % (12, "æbler", 35.50)) Outputtet vil være:
12 æbler koster 35.50 kr.
Her sker der tre ting:
%derstattes af det første element i tuplen, heltallet12.%serstattes af det andet element, strengen"æbler".%.2ferstattes af det tredje element, flydende tal35.50, formateret til to decimaler.
Hvis du kun skal indsætte en enkelt værdi, er det ikke nødvendigt at pakke den ind i en tupel:
print("Velkommen til %s!" % "MinHjemmeside") Output:
Velkommen til MinHjemmeside!
Dyk ned i Konverteringsspecifikatoren
En konverteringsspecifikator er mere end bare et % og et bogstav. Den har en fuld struktur, der giver detaljeret kontrol over formateringen. De fleste dele er valgfrie.
%[<flag>][<bredde>][.<præcision>]<type>
Kun % og <type> er obligatoriske. Lad os bryde de enkelte dele ned:
| Komponent | Betydning |
|---|---|
% | Introducerer konverteringsspecifikatoren. |
<flag> | Valgfrie flag, der finjusterer formateringen (f.eks. justering, fortegn). |
<bredde> | Specificerer den minimale feltbredde for outputtet. |
.<præcision> | Bestemmer antallet af decimaler for flydende tal eller den maksimale længde for strenge. |
<type> | Angiver typen af konvertering (f.eks. heltal, streng, flydende tal). |
Konverteringstyper
Typen er den vigtigste del af specifikatoren. Den fortæller Python, hvordan værdien skal fortolkes og formateres. Her er en oversigt over de mest almindelige typer:
Heltalstyper (Integer)
d,i,u: Konverterer til et decimalt heltal.dogier identiske.x,X: Konverterer til et heksadecimalt heltal (med små eller store bogstaver).o: Konverterer til et oktalt heltal.
print("Decimal: %d, Heksadecimal: %x, Oktal: %o" % (255, 255, 255)) Output:
Decimal: 255, Heksadecimal: ff, Oktal: 377
Flydende Tal-typer (Floating-Point)
f,F: Standard flydende tal-notation.e,E: Eksponentiel (videnskabelig) notation (f.eks. 1.23e+04).g,G: Vælger automatisk mellemfogebaseret på tallets størrelse for at give den mest kompakte repræsentation.
print("Standard: %f, Eksponentiel: %e" % (12345.678, 12345.678)) Output:
Standard: 12345.678000, Eksponentiel: 1.234568e+04
Tegn- og Strengtyper
c: Et enkelt tegn. Kan være en streng af længde 1 eller et heltal, der konverteres via ASCII/Unicode.s: En streng (brugerstr()til at konvertere objektet).r: En streng (brugerrepr()til at konvertere objektet).a: En streng (brugerascii()til at konvertere objektet, hvilket escaper non-ASCII tegn).
print("Tegn: %c, Streng: %s" % (65, "Hej Verden")) Output:
Tegn: A, Streng: Hej Verden
Det Bogstavelige Procenttegn
Hvordan udskriver man et procenttegn, når det bruges til at starte en specifikator? Ved at fordoble det: %%.
print("Vi tilbyder %d%% rabat!" % 20) Output:
Vi tilbyder 20% rabat!
Justering af output med Bredde og Præcision
Bredde- og præcisionskomponenterne giver dig kontrol over outputtets layout.
<bredde>-komponenten
Dette angiver den mindste bredde for feltet. Hvis den formaterede værdi er kortere end bredden, bliver den som standard højrejusteret og fyldt op med mellemrum til venstre.
print("[%10s]" % "test") print("[%10d]" % 123) Output:
[ test] [ 123]
Hvis værdien er længere end den specificerede bredde, ignoreres bredden.
.<præcision>-komponenten
For flydende tal (f, e) bestemmer præcisionen antallet af cifre efter decimaltegnet.
import math print("Pi er ca. %.2f" % math.pi) # math.pi er 3.1415926... Output:
Pi er ca. 3.14
For strenge (s, r, a) bestemmer præcisionen den maksimale længde af strengen. Den afkorter strengen, hvis den er længere.

print("[%.5s]" % "DetteErEnLangStreng") Output:
[Dette]
Finjustering med Konverteringsflag
Flag giver endnu mere finkornet kontrol over outputtet.
| Flag | Beskrivelse |
|---|---|
- | Venstrejusterer outputtet i feltet (standard er højrejustering). |
+ | Viser altid fortegn (+ eller -) for numeriske værdier. |
' ' (mellemrum) | Indsætter et foranstillet mellemrum for positive tal (og et minustegn for negative). |
0 | Fyld op med foranstillede nuller i stedet for mellemrum, når bredden er større end værdien. |
# | Tilføjer base-præfiks for oktale og heksadecimale tal (0o, 0x) eller tvinger et decimaltegn for flydende tal. |
Eksempel med en kombination af flag, bredde og præcision:
print("[%-10d]" % 123) # Venstrejusteret print("[%+10d]" % 123) # Med plustegn print("[%010d]" % 123) # Nul-padding print("%#x" % 255) # Heksadecimalt med '0x' præfiks Output:
[123 ] [ +123] [0000000123] 0xff
Brug af Ordbøger (Dictionary Mapping)
En af de mest kraftfulde funktioner ved modulo-formatering er evnen til at bruge en ordbog (dictionary) til at levere værdier i stedet for en tupel. Dette gør koden markant mere læsbar, især når der er mange værdier involveret. Syntaksen ændres en smule, så man inkluderer ordbogens nøgle i parentes efter %-tegnet.
Dette kaldes ordbogsmapping.
data = {"vare": "kaffe", "antal": 3, "pris_pr_stk": 25.50} formateret_streng = "Du har bestilt %(antal)d stk. %(vare)s til en pris af %(pris_pr_stk).2f kr. pr. stk." print(formateret_streng % data) Output:
Du har bestilt 3 stk. kaffe til en pris af 25.50 kr. pr. stk.
Fordelene er tydelige:
- Læsbarhed: Det er klart, hvilken værdi der indsættes hvor.
- Fleksibilitet: Rækkefølgen af nøgler i ordbogen er ligegyldig.
- Genbrug: Du kan genbruge den samme nøgle flere steder i formateringsstrengen.
Ofte Stillede Spørgsmål (FAQ)
Er modulo-formatering stadig relevant i moderne Python?
Selvom f-strenge (introduceret i Python 3.6) og .format()-metoden generelt anbefales til ny kode på grund af bedre læsbarhed og ydeevne, er modulo-formatering ikke forældet. Det er afgørende at kunne læse og vedligeholde legacy-kode, og mange logging-biblioteker bruger stadig denne syntaks internt for effektivitet. At kende den er et tegn på en velafrundet Python-udvikler.
Hvad sker der, hvis typen ikke matcher værdien?
Hvis du forsøger at formatere en værdi med en uforenelig type (f.eks. bruge %d på en streng som "hej"), vil Python kaste en TypeError. Dette er en almindelig fejl, så det er vigtigt at sikre, at typerne i din formateringsstreng stemmer overens med de data, du leverer.
Kan man kombinere flere flag?
Ja, du kan sagtens kombinere flere flag. For eksempel betyder %-010d, at outputtet skal være venstrejusteret (-), have en minimumsbredde på 10, og... vent! I dette tilfælde vil - (venstrejustering) overskrive 0 (nul-padding), da det ikke giver mening at nul-padde til højre. Men en kombination som %+010d er gyldig og vil producere et fortegn, nul-padding og have en minimumsbredde på 10.
Konklusion
Modulo-operatoren til strengformatering er en robust og alsidig del af Pythons historie. Selvom nyere metoder ofte er at foretrække, giver en solid forståelse af %-formatering dig mulighed for at navigere i enhver Python-kodebase med selvtillid. Fra simple erstatninger til avanceret kontrol over justering, præcision og datatyper, tilbyder denne klassiske teknik et komplet værktøjssæt til at manipulere og præsentere tekstdata. Ved at mestre dens syntaks, konverteringstyper, flag og ordbogsmapping, har du tilføjet et vigtigt værktøj til din Python-værktøjskasse.
Hvis du vil læse andre artikler, der ligner Modulo-operatoren til strengformatering i Python, kan du besøge kategorien Teknologi.
