Les f-strings sont la façon la plus moderne et lisible de formater des chaînes en Python (depuis Python 3.6). Plus concises que format() et plus puissantes que %, elles permettent d’intégrer des expressions Python directement dans les chaînes avec une syntaxe simple et élégante.
Dans cet article :
- Syntaxe de base des f-strings
- Expressions et appels de fonctions
- Formatage des nombres (précision, padding, séparateurs)
- Formatage des dates
- Alignement et largeur
- Échappement des accolades
- Comparaison avec
format()et% - Astuces et bonnes pratiques
Pré-requis : Python 3.6 ou plus récent.
Syntaxe de base
Intégrer des variables
nom = "Alice"
age = 30
# Ancienne méthode avec %
message = "Bonjour %s, vous avez %d ans." % (nom, age)
# Méthode .format()
message = "Bonjour {}, vous avez {} ans.".format(nom, age)
# f-string (moderne et lisible)
message = f"Bonjour {nom}, vous avez {age} ans."
print(message) # Bonjour Alice, vous avez 30 ans.
Avantages :
- Plus court et plus lisible
- Les variables sont insérées directement
- Pas besoin de répéter les variables à la fin
Expressions dans les f-strings
Vous pouvez évaluer des expressions Python directement dans les accolades :
x = 10
y = 5
print(f"La somme de {x} et {y} est {x + y}")
# La somme de 10 et 5 est 15
print(f"Le produit est {x * y}")
# Le produit est 50
print(f"{x} est {'pair' if x % 2 == 0 else 'impair'}")
# 10 est pair
Appeler des fonctions
def prix_ttc(prix_ht, tva=0.20):
return prix_ht * (1 + tva)
prix = 100
print(f"Prix TTC : {prix_ttc(prix):.2f}€")
# Prix TTC : 120.00€
Accéder aux attributs et méthodes
texte = "python"
print(f"Majuscule : {texte.upper()}")
# Majuscule : PYTHON
print(f"Longueur : {len(texte)} caractères")
# Longueur : 6 caractères
Formatage des nombres
Les f-strings offrent une syntaxe puissante pour formater les nombres : précision décimale, séparateurs de milliers, pourcentages, notation scientifique et bases numériques.
Arrondir à n décimales
pi = 3.141592653589793
print(f"{pi:.2f}") # 3.14 (2 décimales)
print(f"{pi:.4f}") # 3.1416 (4 décimales)
print(f"{pi:.0f}") # 3 (entier)
Séparateurs de milliers
nombre = 1234567.89
print(f"{nombre:,.2f}") # 1,234,567.89 (virgule US)
print(f"{nombre:_.2f}") # 1_234_567.89 (underscore)
Seuls deux séparateurs de milliers existent : , et _. Attention au faux ami {nombre: .2f} : l’espace n’est pas un séparateur de milliers mais une option de signe (elle réserve un espace devant les nombres positifs).
Pour le format français (espace comme séparateur), on passe par un replace :
print(f"{nombre:,.2f}".replace(",", " ")) # 1 234 567.89
Autre possibilité, le format n qui utilise la locale du système :
import locale
locale.setlocale(locale.LC_ALL, 'fr_FR.UTF-8')
nombre_entier = 1234567
print(f"{nombre_entier:n}") # 1 234 567
Le format n n’insère les séparateurs de la locale que pour les entiers : sur un float, il se comporte comme g (6 chiffres significatifs) et afficherait 1,23457e+06.
Note : selon la version de Windows, la locale
fr_FR.UTF-8peut ne pas être disponible ; utilisez alors'French_France.1252'.
Pourcentages
taux = 0.1547
print(f"Taux : {taux:.2%}") # Taux : 15.47%
print(f"Taux : {taux:.1%}") # Taux : 15.5%
Notation scientifique
grand_nombre = 1234567890
print(f"{grand_nombre:e}") # 1.234568e+09
print(f"{grand_nombre:.2e}") # 1.23e+09
Nombres binaires, hexadécimaux, octaux
nombre = 42
print(f"Binaire : {nombre:b}") # 101010
print(f"Octal : {nombre:o}") # 52
print(f"Hexadécimal : {nombre:x}") # 2a
print(f"Hexadécimal (MAJ) : {nombre:X}") # 2A
print(f"Hex avec préfixe : {nombre:#x}") # 0x2a
Largeur, alignement et padding
Pour créer des tableaux ou aligner du texte, les f-strings permettent de contrôler la largeur, l’alignement et le caractère de remplissage.
Largeur minimale
nom = "Alice"
age = 30
print(f"{nom:10} | {age:3}")
# Alice | 30
Alignement
texte = "Python"
print(f"{texte:<10}") # Python (gauche)
print(f"{texte:>10}") # Python (droite)
print(f"{texte:^10}") # Python (centré)
Padding avec un caractère personnalisé
nombre = 42
print(f"{nombre:0>5}") # 00042 (zéros à gauche)
print(f"{nombre:*<5}") # 42*** (étoiles à droite)
print(f"{nombre:-^7}") # --42--- (tirets centré)
Combiner largeur et précision
prix = 12.5
print(f"{prix:10.2f}") # 12.50 (10 caractères, 2 décimales)
print(f"{prix:0>10.2f}") # 0000012.50 (padding zéros)
Formatage des dates
Les objets datetime peuvent être formatés directement dans les f-strings en utilisant les codes de format strftime.
from datetime import datetime
maintenant = datetime.now()
print(f"Date : {maintenant:%Y-%m-%d}")
# Date : 2026-02-09
print(f"Heure : {maintenant:%H:%M:%S}")
# Heure : 14:30:45
print(f"Date complète : {maintenant:%A %d %B %Y}")
# Date complète : Monday 09 February 2026
print(f"Format court : {maintenant:%d/%m/%Y %H:%M}")
# Format court : 09/02/2026 14:30
Format français :
import locale
locale.setlocale(locale.LC_TIME, 'fr_FR.UTF-8')
print(f"{maintenant:%A %d %B %Y}")
# lundi 09 février 2026
Même remarque que plus haut : sous Windows, remplacez au besoin
'fr_FR.UTF-8'par'French_France.1252'.
Échappement des accolades
Pour afficher des accolades littérales dans une f-string, doublez-les :
x = 10
print(f"La variable x vaut {x}")
# La variable x vaut 10
print(f"Pour afficher {{x}}, écrivez {{{{x}}}}")
# Pour afficher {x}, écrivez {{x}}
Règle :
{variable}-> évalue la variable{{-> affiche{}}-> affiche}
F-strings multiligne
Les f-strings fonctionnent avec les chaînes multiligne (triple guillemets), pratique pour générer des messages longs ou des templates.
nom = "Alice"
age = 30
ville = "Paris"
message = f"""
Bonjour {nom},
Vous avez {age} ans et vous habitez à {ville}.
Bienvenue sur notre plateforme !
"""
print(message)
Debugging avec f-strings (Python 3.8+)
La syntaxe {variable=} affiche le nom de la variable et sa valeur :
x = 10
y = 20
print(f"{x=}, {y=}, {x + y=}")
# x=10, y=20, x + y=30
Très pratique pour le debugging :
def calculer_total(prix, quantite):
total = prix * quantite
print(f"{prix=}, {quantite=}, {total=}")
return total
calculer_total(12.5, 3)
# prix=12.5, quantite=3, total=37.5
F-strings imbriquées
Pour des cas avancés, vous pouvez imbriquer des f-strings pour construire des formats dynamiques :
nombre = 1234.5678
precision = 2
print(f"{nombre:.{precision}f}")
# 1234.57
Exemple avec alignement dynamique :
texte = "Python"
largeur = 15
alignement = "^" # centré
print(f"{texte:{alignement}{largeur}}")
# Python
Comparaison avec les autres méthodes
Avant Python 3.6, deux méthodes principales existaient pour formater des chaînes. Voici pourquoi les f-strings sont supérieures.
Ancien style avec %
nom = "Alice"
age = 30
message = "Bonjour %s, vous avez %d ans." % (nom, age)
Inconvénients :
- Syntaxe peu lisible
- Types à spécifier (
%s,%d,%f) - Erreurs si le nombre d’arguments ne correspond pas
Méthode .format()
message = "Bonjour {}, vous avez {} ans.".format(nom, age)
# Avec indices
message = "Bonjour {0}, vous avez {1} ans. {0} est génial !".format(nom, age)
# Avec noms
message = "Bonjour {nom}, vous avez {age} ans.".format(nom=nom, age=age)
Inconvénients :
- Verbeux (répétition des variables)
- Moins lisible que les f-strings
f-strings (recommandé)
message = f"Bonjour {nom}, vous avez {age} ans."
Avantages :
- Syntaxe concise et lisible
- Évaluation d’expressions directement
- Plus rapide (évaluation au moment de l’exécution)
- Debugging intégré avec
{variable=}
Cas d’usage pratiques
Voici quelques exemples concrets d’utilisation des f-strings dans des situations réelles.
Générer un tableau
produits = [
("Livre", 12.50, 2),
("Stylo", 1.20, 5),
("Cahier", 3.00, 4),
]
print(f"{'Produit':<15} {'Prix':>8} {'Qté':>5} {'Total':>8}")
print("-" * 40)
for nom, prix, qte in produits:
total = prix * qte
print(f"{nom:<15} {prix:>8.2f} {qte:>5} {total:>8.2f}")
Résultat :
Produit Prix Qté Total
----------------------------------------
Livre 12.50 2 25.00
Stylo 1.20 5 6.00
Cahier 3.00 4 12.00
Générer du SQL dynamiquement
table = "utilisateurs"
colonnes = ["nom", "email", "age"]
valeurs = ["Alice", "alice@example.com", 30]
query = f"""
INSERT INTO {table} ({', '.join(colonnes)})
VALUES ({', '.join(f"'{v}'" for v in valeurs)})
"""
print(query)
# INSERT INTO utilisateurs (nom, email, age)
# VALUES ('Alice', 'alice@example.com', '30')
Attention : pour du vrai code SQL, utilisez des requêtes paramétrées pour éviter les injections SQL.
Logs avec horodatage
from datetime import datetime
def log(message):
timestamp = datetime.now()
print(f"[{timestamp:%Y-%m-%d %H:%M:%S}] {message}")
log("Application démarrée")
log("Connexion à la base de données réussie")
# [2026-02-09 14:30:45] Application démarrée
# [2026-02-09 14:30:46] Connexion à la base de données réussie
Pièges à éviter
Certaines erreurs courantes peuvent survenir avec les f-strings. Voici comment les éviter.
Variables non définies
# Erreur : nom n'est pas défini
print(f"Bonjour {nom}")
# NameError: name 'nom' is not defined
F-strings et backslashes
Avant Python 3.12, les backslashes n’étaient pas autorisés dans la partie expression des f-strings :
items = ["pomme", "poire", "cerise"]
# Erreur avant Python 3.12
print(f"Liste : {'\n'.join(items)}")
# SyntaxError: f-string expression part cannot include a backslash
# Solution compatible avec toutes les versions : passer par une variable
saut = "\n"
print(f"Liste : {saut.join(items)}")
Depuis Python 3.12 (PEP 701), cette limite a disparu et le premier exemple fonctionne sans erreur.
Guillemets imbriqués
# Erreur de syntaxe avant Python 3.12
print(f"Message : {"Hello"}")
# Solution : alterner les guillemets
print(f"Message : {'Hello'}")
print(f'Message : {"Hello"}')
Là aussi, la PEP 701 a levé la restriction : depuis Python 3.12, on peut réutiliser le même type de guillemets à l’intérieur de l’expression.
Bonnes pratiques
À faire
- Utiliser les f-strings par défaut (Python 3.6+)
- Formater les nombres avec précision :
{prix:.2f} - Utiliser
{variable=}pour le debugging - Aligner les tableaux avec
<,>,^ - Extraire les expressions complexes dans des variables
# Difficile à lire
print(f"Total : {sum([p['prix'] * p['qte'] for p in produits]):.2f}€")
# Plus clair
total = sum(p['prix'] * p['qte'] for p in produits)
print(f"Total : {total:.2f}€")
À éviter
- Utiliser
%ou.format()sans raison (hors compatibilité Python < 3.6) - Expressions trop complexes dans les f-strings
- F-strings dans des boucles intensives si la performance est critique (envisager
join)
Conclusion
Les f-strings sont la méthode moderne, performante et lisible pour formater des chaînes en Python. Elles remplacent avantageusement % et .format() dans la quasi-totalité des cas d’usage.
Points clés à retenir :
- Syntaxe :
f"Texte {variable}" - Évaluation d’expressions :
f"{x + y}" - Formatage de nombres :
{prix:.2f},{nombre:,} - Alignement :
{texte:<10},{texte:>10},{texte:^10} - Debugging :
{variable=}(Python 3.8+)