W3docs

Formattazione delle Stringhe

Scopri i tre modi per formattare le stringhe in Python — operatore %, str.format() e f-string — con esempi su numeri, allineamento e utilizzo pratico.

La formattazione delle stringhe è il modo in cui si incorporano valori di variabili nel testo. Python offre tre approcci: l'operatore legacy %, il versatile metodo str.format() e la moderna sintassi delle f-string introdotta in Python 3.6. Ognuno produce lo stesso risultato per i casi semplici, ma differiscono in potenza, leggibilità e nella versione di Python richiesta.

Questo capitolo tratta:

  • L'operatore % e i suoi codici di tipo
  • str.format() con segnaposto posizionali, indicizzati e con parola chiave
  • Le f-string — espressioni inline e il specificatore di debug =
  • Specificatori di formato: larghezza, allineamento, precisione e basi numeriche
  • Come scegliere il metodo giusto per la propria situazione

Capitoli correlati: Stringhe Python · Concatenare Stringhe · Caratteri di Escape · Metodi delle Stringhe

L'Operatore %

L'operatore % è lo stile di formattazione delle stringhe più antico in Python, mutuato dal printf del linguaggio C. Si inseriscono codici di tipo nella stringa come segnaposto, quindi si forniscono i valori dopo il simbolo %.

Codici di tipo comuni

CodiceSignificatoInput di esempioOutput
%sString (o qualsiasi oggetto)"Alice"Alice
%dIntero4242
%fFloat3.143.140000
%rrepr() dell'oggetto"hi\n"'hi\n'

Formattazione con %s e %d

python— editable, runs on the server
My name is John and I am 30 years old.

Quando si ha più di un valore, si passano in una tupla. I valori vengono abbinati ai segnaposto da sinistra a destra:

item = "coffee"
price = 2.50
qty = 3
print("Item: %s | Price: $%.2f | Qty: %d" % (item, price, qty))
Item: coffee | Price: $2.50 | Qty: 3

Il codice di formato %.2f arrotonda il float a 2 cifre decimali.

Quando usare %: Principalmente quando si lavora con codice molto vecchio o codebase Python 2. Per il nuovo codice, si preferisce str.format() o le f-string.

str.format()

Il metodo str.format() utilizza segnaposto con parentesi graffe {} ed è più flessibile di %. Supporta argomenti posizionali, riutilizzo basato su indice e argomenti con parola chiave.

Segnaposto Posizionali

Le parentesi graffe vuote {} vengono riempite da sinistra a destra con gli argomenti passati a format():

Formattazione delle stringhe con il metodo format in Python

python— editable, runs on the server
My name is John and I am 30 years old.

Segnaposto Basati su Indice

Si inserisce un numero all'interno delle parentesi graffe per selezionare un argomento specifico. Si può anche ripetere lo stesso argomento:

name = "John"
age = 30
print("{0} is {1} years old and {0} likes Python.".format(name, age))
John is 30 years old and John likes Python.

Segnaposto con Parola Chiave

Si usano nomi di parole chiave per la formattazione più leggibile. Questo consente anche di riordinare i valori indipendentemente dalla lista degli argomenti:

name = "John"
age = 30
print("{name} is {age} years old.".format(name=name, age=age))
John is 30 years old.

Si può spacchettare un dizionario direttamente con **:

person = {"name": "Alice", "city": "London"}
print("{name} lives in {city}.".format(**person))
Alice lives in London.

f-String (Python 3.6+)

Le f-string (letterali di stringa formattati) si scrivono aggiungendo il prefisso f o F alla stringa. Qualsiasi espressione all'interno di {} viene valutata in fase di esecuzione e convertita in una stringa. Sono l'opzione più veloce e leggibile per il codice Python moderno.

Formattazione delle stringhe con le f-string in Python

python— editable, runs on the server
My name is John and I am 30 years old.

Poiché le parentesi graffe possono contenere qualsiasi espressione Python valida, non si è limitati ai semplici nomi di variabili:

x = 10
y = 3
print(f"{x} divided by {y} is {x / y:.2f}")
10 divided by 3 is 3.33

Il Specificatore di Debug = (Python 3.8+)

Si aggiunge = dopo il nome della variabile per stampare sia il nome della variabile che il suo valore — molto utile per il debug rapido:

val = 42
result = val * 2
print(f"{val=}, {result=}")
val=42, result=84

Specificatori di Formato

Tutti e tre i metodi supportano un mini-linguaggio per controllare come vengono visualizzati i valori. La sintassi all'interno di {} per format() e le f-string è:

{[value]:[fill][align][sign][width][grouping][.precision][type]}

Allineamento e Larghezza

Si usa < (sinistra), > (destra) o ^ (centro) con un numero di larghezza:

name = "John"
print(f"|{name:<10}|")   # left-align in a field of width 10
print(f"|{name:>10}|")   # right-align
print(f"|{name:^10}|")   # center
|John      |
|      John|
|   John   |

Si può specificare un carattere di riempimento prima del simbolo di allineamento:

print(f"|{'hello':*^15}|")  # fill with * and center
|*****hello*****|

Precisione Decimale

pi = 3.14159265
print(f"Pi is approximately {pi:.2f}")   # 2 decimal places
print(f"Pi is approximately {pi:.4f}")   # 4 decimal places
Pi is approximately 3.14
Pi is approximately 3.1416

Formattazione dei Numeri

price = 1234567.89
print(f"{price:,.2f}")   # comma as thousands separator
print(f"{price:e}")      # scientific notation
1,234,567.89
1.234568e+06

Per visualizzare un rapporto come percentuale, si usa il specificatore di tipo %:

ratio = 0.853
print(f"{ratio:.1%}")
85.3%

Basi degli Interi

x = 255
print(f"{x:d}")    # decimal   -> 255
print(f"{x:x}")    # hex lower -> ff
print(f"{x:X}")    # hex upper -> FF
print(f"{x:o}")    # octal     -> 377
print(f"{x:b}")    # binary    -> 11111111
255
ff
FF
377
11111111

Gli stessi specificatori funzionano con str.format():

print("{:b}".format(255))   # 11111111
print("{:x}".format(255))   # ff

Riempimento con Zeri

Si riempie un intero a una larghezza fissa con zeri iniziali usando 0 prima della larghezza:

print(f"{42:010d}")   # zero-pad to 10 digits
0000000042

Scegliere il Metodo Giusto

SituazioneScelta migliore
Python 3.6 o versioni successivef-string
Deve supportare Python 2Operatore %
Riutilizzare la stessa stringa templatestr.format() con una variabile
Costruire template in fase di esecuzionestr.format()
Stampa di debug rapidaf-string con specificatore =
Vecchio codebase da mantenereRispettare lo stile già usato

Le f-string sono il default raccomandato per tutto il nuovo codice Python 3. Sono più veloci di str.format() (nessun overhead da chiamata di metodo) e più leggibili di %.

Pratica

Pratica
Which of the following are correct ways to format strings in Python according to the content on the provided URL?
Which of the following are correct ways to format strings in Python according to the content on the provided URL?
Was this page helpful?