3 façons de formater une chaîne¶
Voici un exemple de ces trois façons d'introduire des données dans une chaîne de caractères :
name = 'John'
âge = 25
"Je m'appelle %s, j'ai %d ans." % (nom, âge) # façon %
"Je m'appelle {n}, j'ai {a} ans.".format(n = nom, a = âge) # façon format
f"Je m'appelle {nom}, j'ai {âge} ans." # façon f
Elles affichent toutes: Je m'appelle John, j'ai 25 ans.
Le second but du formatage est de pouvoir afficher les données comme nous le voulons. Nous allons voir comment faire cela.
Formater avec le %¶
C'est la façon originale de formater en Python. Elle est puissante mais limitée aux types :
- int
- float
- string
Vous pouvez utiliser n'importe autre type tant qu'il peut être converti en chaîne de caractères :
print("The list %s is small" % [1,2,3])
The list [1, 2, 3] is small
Si quelque chose ne peut pas être converti en int, float ou string, vous ne pouvez pas l'imprimer de cette façon (cela n'arrive pas souvent).
Numériques¶
Puisque nous ne voulons pas visualiser la comptabilité de la même manière que des données scientifiques, et ce même si l'ordinateur les stocke de la même manière, expliquons-le à Python pour obtenir ce que nous voulons:
x = 1200
y = 6.022140857E23
print("My portfolio value is %+.2f €" % x)
print("Avogadro constant is %.3E mol⁻¹" % y)
My portfolio value is +1200.00 € Avogadro constant is 6.022E+23 mol⁻¹
Comme vous l'avez deviné, la valeur qui remplace la partie de la chaîne %...f
(pour un réel, float,) ou %...E
(pour la notation scientifique) est l'argument après le %
après la chaîne.
S'il y a plus d'un endroit à remplacer dans la chaîne, vous devez alors donner un n-uplet de valeurs en argument (voir premier exemple avec John).
Voici un résumé des règles de formatage pour un entier (digit) et pour un réel (float):
Chaîne de format | Résultat | Explication |
---|---|---|
'%3d'% 2 |
' 2' |
réserve au moins 3 cases |
'%3d'% 12345 |
'12345' |
|
'%*d'% (3, 2) |
' 2' |
nb de cases + valeur en argument |
'%-3d'% 2 |
'2 ' |
3 cases et valeur alignée à gauche |
'%03d'% 2 |
'002' |
3 cases et remplissage avec 0 |
'% d'% 2 |
' 2' |
une case pour le signe de la valeur |
'%+d'% 2 |
'+2' |
signe et valeur |
'%+ 3d'% -2 |
' -2' |
|
'%.4f'% 2 |
'2.0000' |
4 chiffres après la virgule |
'%.* f'% (4, 2) |
'2.0000' |
nb de chiffres après la virgule + valeur en arg |
'%10.4f'% 2 |
'2.0000' |
10 cases, 4 chiffres après la virgule |
'%010.4f'% 2 |
'00002.0000' |
comme précédent mais rempli avec 0 |
'%0*.* f'% (10, 4, 2) |
'00002.0000' |
tout dans l'argument |
La lettre de fin de la chaîne de format peut être:
Lettre | Signification |
---|---|
b | Binaire |
o | Octal |
d | Décimal |
x | Hexadécimal (minuscule) |
X | Hexadécimal (majuscule) |
e | Format exponentiel à virgule flottante (minuscule) |
E | Format exponentiel à virgule flottante (majuscule) |
f | Format décimal à virgule flottante |
F | Format décimal à virgule flottante |
g | Identique à "e" si l'exposant est supérieur à -4 ou inférieur à la précision, "f" sinon |
G | Identique à "E" si l'exposant est supérieur à -4 ou inférieur à la précision, "F" sinon |
r | String (convertit tout objet python à l'aide de repr() ) |
s | String (convertit tout objet python en utilisant str() ) |
% | Aucun argument n'est converti, ce qui entraîne un caractère "%" dans le résultat (La spécification complète est %%.) |
Chaîne de caractères¶
Même les chaînes de caractère peuvent nécessiter d'être formatées. Voyez comment les noms sont justifiés à gauche et coupés si trop longs:
math_exam = {'Alice':12.5, 'Alexandre':16, 'Bob':11, 'AVeryVeryLongName':5}
for n,m in math_exam.items():
print("%-11.10s has %4.1f/20" % (n,m))
Alice has 12.5/20 Alexandre has 16.0/20 Bob has 11.0/20 AVeryVeryL has 5.0/20
où %-11.10s
signifie:
- % : commence le format
- s : une chaîne de caractère (termine aussi le format)
- 11 : attribue 11 cases au minimum
- .10 : autorise 10 caractères maximum
- -: justifie à gauche
La méthode f¶
Lorsque vous connaissez le formatage avec le %, le formatage f est simple. Il suffit de remplacer '%3.1d' % x
par f'{x: 3.1d}'
ce qui est
- plus compact,
- plus facile à lire puisque la variable et son format sont ensemble
- sans argument après la chaîne
Il n'est pas obligatoire d'indiquer le type de la valeur si on ne désire pas de formatage spécial (cf l'exemple en haut de la page).
Avec la méthode f l'exemple précédent est maintenant:
for n,m in math_exam.items():
print(f"{n:<11.10s} has {m:4.1f}/20")
Alice has 12.5/20 Alexandre has 16.0/20 Bob has 11.0/20 AVeryVeryL has 5.0/20
Notez que nous avons déjà une exception à la règle de remplacement. L'alignement à gauche est <
et non -
(à droite c'est >
et centré est^
).
Enfin, on peut mettre n'importe quelle opération mathématique ou opération complexe en tant que valeur:
import math
x = 2
f"Square root of {x} is {math.sqrt(x):.4f}"
'Square root of 2 is 1.4142'
Une chaîne f peut aussi être avec un '''
pour le texte sur plusieurs lignes (notez le caractère spécial \n
visible dans [Out]
qui devient une nouvelle ligne lorsqu'on l'affiche avec print
).
text = f'''
a = {2+2}
b = {7.432:.1f}
'''
print(text)
text
a = 4 b = 7.4
'\na = 4\nb = 7.4\n'
Vous trouverez ici une explication complète de la syntaxe du formatage.
Exercice¶
Comprenez la sortie de ces cellules (vous pouvez aussi deviner avant de regarder le résultat) :
'a'+'b'+f'{10+5}'+'{20%3}'+f'str<{"hi":^4}>'+'d'+'e'
'ab15{20%3}str< hi >de'
f'{list({x%3 for x in range(10)})}'
'[0, 1, 2]'
Qu'en est-il du formatage avec format ?¶
La méthode f a été introduite dans Python 3.6 et je pense qu'elle remplace avantageusement format, donc pas de réel besoin d'apprendre le formatage format.
Cependant, voici une présentation en quelques mots:
- la structure de la chaîne est identique à celle de f si vous nommez les variables
- les données sont des arguments de la méthode
format
(une méthode de la classe String) - vous pouvez utiliser des nombres dans le format de chaîne pour faire référence aux arguments
name = 'John'
mark = 16.78
print("The mark of {n} is {m:.1f}.".format(n=name, m=mark))
print("The mark of {0} is {1}.".format(name, mark))
The mark of John is 16.8. The mark of John is 16.78.
{{ PreviousNext("02 - La porté des variables.ipynb", "04 - Generators.ipynb")}}