Is there a way to use a percentage in Python?

Modulo-operatoren til strengformatering i Python

13/04/2003

Rating: 4.59 (12555 votes)

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.

How do modulo operators format strings?
String operands are used to format strings, but modulo operators perform distinct functions: string formatting. On the left side of the % operator is a string that contains the conversion specifier or more of them. On the right side, the get inserted into , to replace the converter specifiers.
Indholdsfortegnelse

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:

  • %d erstattes af det første element i tuplen, heltallet 12.
  • %s erstattes af det andet element, strengen "æbler".
  • %.2f erstattes af det tredje element, flydende tal 35.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:

KomponentBetydning
%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. d og i er 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 mellem f og e baseret 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 (bruger str() til at konvertere objektet).
  • r: En streng (bruger repr() til at konvertere objektet).
  • a: En streng (bruger ascii() 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.

What are some use cases of the modulo operator in Python?
Let’s take a look at some use cases of the modulo operator in Python. An extensively used application of the modulo operator in Python is to determine the evenness or oddness of a number. This can be done by checking the remainder of the number divided by 2.

print("[%.5s]" % "DetteErEnLangStreng") 

Output:

[Dette] 

Finjustering med Konverteringsflag

Flag giver endnu mere finkornet kontrol over outputtet.

FlagBeskrivelse
-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).
0Fyld 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.

Go up