Participer au site avec un Tip
Rechercher
 

Améliorations / Corrections

Vous avez des améliorations (ou des corrections) à proposer pour ce document : je vous remerçie par avance de m'en faire part, cela m'aide à améliorer le site.

Emplacement :

Description des améliorations :

Utilisation de chaînes formatées

Les chaînes de caractères Les chaînes formatées « à la C »


Accès rapide :
La vidéo
Présentation des chaînes formatées.
Formater des valeurs entières
Formater des valeurs flottantes
Formater des chaînes de caractères
Les chaînes formatées multi-lignes
Utilisation de la méthode format pour formater une chaîne
Travaux pratiques
L'énoncé
La correction

La vidéo

Cette vidéo vous présente les principales possibilités de formatage de données dans une chaîne de caractères de type f"".


Utilisation de chaînes formatées

Présentation des chaînes formatées.

Il existe une autre forme de chaînes de caractères : « les chaînes formatées ». Une chaîne de caractères formatées s'introduit via la syntaxe f"" (la lettre f correspondant, bien entendu, à formatted string). On peut insérer des variables dans une chaîne formatée : cela se fait grâce à une paire d'accolades. Voici un premier exemple simple d'utilisation.

>>> num = 1
>>> den = 3
>>> fraction = f"[{num}/{den}]"
>>> print(fraction)
[1/3]
>>> 
ce type de chaîne est disponible depuis la version 3.6 de Python. Si vous utilisez une version antérieure de python, vous serez dans l'incapacité de tester les exemples de code proposés. Dans ce cas, descendez à la fin de ce chapitre. Les chaînes formatées sont décrites dans la « PEP 498 -- Literal String Interpolation ».

Vous vous en doutez, mais il est possible de faire la même chose avec la syntaxe f'', comme le montre l'exemple ci-dessous.

>>> num = 1
>>> den = 3
>>> fraction = f'[{num}/{den}]'
>>> print(fraction)
[1/3]
>>> 

Mais pourquoi parle-t-on de chaînes formatées ? Tout simplement par-ce-qu'il est possible de contrôler le format de la chaîne. Par exemple, imaginons que vous souhaitiez afficher vos entiers sur trois caractères, il n'y a qu'à modifier le format en ajoutant :3d derrière le nom de chaque variable injectée.

>>> num = 1
>>> den = 3
>>> fraction = f"[{num:3d}/{den:3d}]"
>>> print(fraction)
[  1/  3]
>>> 

De même, il est possible de remplir la place occupée par chaque entier avec des 0 plutôt que des espaces. Dans ce cas, il faudra plutôt utiliser la séquence :03d (le 0 correspondant au caractère de remplissage).

>>> num = 1
>>> den = 3
>>> fraction = f"[{num:03d}/{den:03d}]"
>>> print(fraction)
[001/003]
>>> 

La syntaxe générale d'un format est la suivante :

format_spec     ::=  [[fill]align][sign][#][0][width][grouping_option][.precision][type]
fill            ::=  <any character>
align           ::=  "<" | ">" | "=" | "^"
sign            ::=  "+" | "-" | " "
width           ::=  digit+
grouping_option ::=  "_" | ","
precision       ::=  digit+
type            ::=  "b" | "c" | "d" | "e" | "E" | "f" | "F" | "g" | "G" | "n" | "o" | "s" | "x" | "X" | "%"
les caractères [] proposés dans le format général indique l'aspect facultatif d'une partie du format. Ainsi [fill] indique que le caractère de remplissage est facultatif et, dans ce cas, c'est l'espace qui sera considéré.

Formater des valeurs entières

Le tableau ci-dessous présente quelques formats possibles pour afficher vos valeurs entières. Dans les exemples qui suivent, num sera initialisé 10 et den à 3.

Le format Description Exemple d'utilisation Résultat
  Indique qu'on veut formater un entier en base décimale (base 10). f"[{num}/{den}]" [10/3]
:d Indique qu'on veut formater un entier en base décimale (base 10). f"[{num:d}/{den:d}]" [10/3]
:3d Indique qu'on veut formater un entier en base décimale (base 10) sur 3 caractères. f"[{num:3d}/{den:3d}]" [ 10/  3]
:03d Indique qu'on veut formater un entier en base décimale (base 10) sur 3 caractères et si la valeur est inférieure à 100 alors on remplit la chaîne avec des 0. f"[{num:03d}/{den:03d}]" [010/003]
:b Indique qu'on veut formater un entier en base binaire (base 2). f"[{num:b}/{den:b}]" [1010/11]
:5b Indique qu'on veut formater un entier en base binaire (base 2) sur 5 caractères. f"[{num:5b}/{den:5b}]" [ 1010/   11]
:05b Indique qu'on veut formater un entier en base binaire (base 2) sur 5 caractères et si la valeur est inférieure à cette taille alors on remplit la chaîne avec des 0. f"[{num:05b}/{den:05b}]" [01010/00011]
:o Indique qu'on veut formater un entier en base octale (base 8). f"[{num:o}/{den:o}]" [12/3]
:3o Indique qu'on veut formater un entier en base octale (base 8) sur 3 caractères. f"[{num:3o}/{den:3o}]" [ 12/  3]
:03o Indique qu'on veut formater un entier en base octale (base 8) sur 3 caractères et si la valeur est inférieure à cette taille alors on remplit la chaîne avec des 0. f"[{num:03o}/{den:03o}]" [012/003]
:x Indique qu'on veut formater un entier en base hexadécimale (base 16), avec les chiffres de a à z en minuscules. f"[{num:x}/{den:x}]" [a/3]
:3x Indique qu'on veut formater un entier en base hexadécimale (base 16) sur 3 caractères, avec les chiffres de a à z en minuscules. f"[{num:3x}/{den:3b}]" [  a/  3]
:03x Indique qu'on veut formater un entier en base hexadécimale (base 16) sur 3 caractères, avec les chiffres de a à z en minuscules. Si la valeur est inférieure à cette taille alors on remplit la chaîne avec des 0. f"[{num:03x}/{den:03x}]" [00a/003]
:X Indique qu'on veut formater un entier en base hexadécimale (base 16), avec les chiffres de a à z en majuscules. f"[{num:X}/{den:X}]" [A/3]
:3X Indique qu'on veut formater un entier en base hexadécimale (base 16) sur 3 caractères, avec les chiffres de a à z en majuscules. f"[{num:3X}/{den:3X}]" [  A/  3]
:03X Indique qu'on veut formater un entier en base hexadécimale (base 16) sur 3 caractères, avec les chiffres de a à z en majuscules. Si la valeur est inférieure à cette taille alors on remplit la chaîne avec des 0. f"[{num:03X}/{den:03X}]" [00A/003]

Formater des valeurs flottantes

Le tableau ci-dessous présente quelques formats possibles pour afficher vos valeurs flottantes. Dans les exemples qui suivent, pi sera initialisé la valeur 3.141592654.

Le format Description Exemple d'utilisation Résultat
  Indique qu'on veut formater un flottant en notation décimale. f"pi = {pi}" pi = 3.141592654
:f Indique qu'on veut formater un flottant en notation décimale. f"pi = {pi:f}" pi = 3.141592654
:.2f Indique qu'on veut formater un flottant en notation décimale et en arrondissant à deux chiffres après la virgule. f"pi = {pi:.2f}" pi = 3.14
:5.2f Indique qu'on veut formater un flottant en notation décimale, sur 5 caractères et en arrondissant à deux chiffres après la virgule. f"pi = {pi:5.2f}" pi =  3.14
:05.2f Indique qu'on veut formater un flottant en notation décimale, sur 5 caractères (le . compris), en arrondissant à deux chiffres après la virgule et en complétant avec des 0. f"pi = {pi:05.2f}" pi = 03.14
:<10.2f Indique qu'on veut formater un flottant en notation décimale, sur 10 caractères (le . compris), en arrondissant à deux chiffres après la virgule et son contenu aligné par la gauche. f"pi = {pi:<10.2f}!" pi = 03.14     !
:>10.2f Indique qu'on veut formater un flottant en notation décimale, sur 10 caractères (le . compris), en arrondissant à deux chiffres après la virgule et son contenu aligné par la droite. f"pi = {pi:>10.2f}!" pi =      03.14!
:e Indique qu'on veut formater un flottant en notation exponentielle. f"pi = {pi:e}" pi = 3.141593e+00
:.2e Indique qu'on veut formater un flottant en notation exponentielle, en arrondissant à deux chiffres après la virgule f"pi = {pi:.2e}" pi = 3.14e+00

Formater des chaînes de caractères

Le tableau ci-dessous présente quelques formats possibles pour formater des chaînes de caractères. Dans les exemples qui suivent, la variable s sera initialisé la valeur "toto".

Le format Description Exemple d'utilisation Résultat
:s Indique qu'on veut formater une chaîne de caractères f"{s}" toto
:10s Indique qu'on veut formater une chaîne de caractères sur dix caractères, aligné par la gauche f">{s:10s}<" >toto      <
:<10s Indique qu'on veut formater une chaîne de caractères sur dix caractères, aligné par la gauche f">{s:<10s}<" >toto      <
:>10s Indique qu'on veut formater une chaîne de caractères sur dix caractères, aligné par la droite f">{s:>10s}<" >      toto<

Les chaînes formatées multi-lignes

Le langage permet aussi l'utilisation de chaînes de caractères formatées multi-lignes. Voici un exemple d'utilisation.

 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
 10 
 11 
identifier = "007"
first_name = "James"
last_name = "Bond"
ltk = True

message = f"""Spy code: {identifier}
    First name: {first_name}
    Last name: {last_name}
    Licence to kill: {ltk}"""
    
print(message)
Exemple d'utilisation d'une chaîne formatée multi-lignes

Et voici les résultats produits par cet exemple.

Spy code: 007
    First name: James
    Last name: Bond
    Licence to kill: True
la syntaxe f''' ... ''' fonctionne aussi très bien.

Utilisation de la méthode format pour formater une chaîne

Les chaînes formatées existent en Python depuis sa version 3.6. Avant, il était possible d'avoir ces mécanismes de formatage, mais il fallait passer la méthode format. Voici un exemple d'utilisation.

>>> num = 1
>>> den = 3
>>> s = "[{0}/{1}]".format(num, den)
>>> print(s)
[1/3]
>>> 

Les valeurs numériques utilisées, à la place des noms de variables, correspondent aux positions des données dans la liste de paramètres.

cette méthode est aujourd'hui obsolète au profit de l'utilisation des chaînes formatées.

Travaux pratiques

L'énoncé

Vous allez commencer un nouveau script Python en copiant les lignes de code suivantes.

first_name_1 = "James"
last_name_1 = "Bond"
salary_1 = 45_000.9999

first_name_2 = "Jason"
last_name_2 = "Bourne"
salary_2 = 30_540.1234

first_name_3 = "Ethan"
last_name_3 = "Hunt"
salary_3 = 100_000
oui, j'aime les films d'espions ;-)

Complétez ce script pour obtenir l'affichage suivant :

+------------+------------+------------+
| First name | Last name  |     Salary |
+------------+------------+------------+
| James      | Bond       |   45001.00 |
| Jason      | Bourne     |   30540.12 |
| Ethan      | Hunt       |  100000.00 |
+------------+------------+------------+

Bon courage et, bien entendu, essayez de faire l'exercice sans regarder directement la correction ci-dessous. ;-)

La correction

Voici ma proposition de code pour réaliser l'affichage demandé.

 1 
 2 
 3 
 4 
 5 
 6 
 7 
 8 
 9 
 10 
 11 
 12 
 13 
 14 
 15 
 16 
 17 
 18 
 19 
 20 
 21 
first_name_1 = "James"
last_name_1 = "Bond"
salary_1 = 45_000.9999

first_name_2 = "Jason"
last_name_2 = "Bourne"
salary_2 = 30_540.1234

first_name_3 = "Ethan"
last_name_3 = "Hunt"
salary_3 = 100_00

line = "+" + ("-" * 12) + "+" + ("-" * 12) + "+" + ("-" * 12) + "+"

print(line)
print(f"| {'First name':10s} | {'Last name':10s} | {'Salary':>10s} |");
print(line)
print(f"| {first_name_1:10s} | {last_name_1:10s} | {salary_1:>10.2f} |");
print(f"| {first_name_2:10s} | {last_name_2:10s} | {salary_2:>10.2f} |");
print(f"| {first_name_3:10s} | {last_name_3:10s} | {salary_3:>10.2f} |");
print(line)
Utilisation de chaînes formatées pour produire un tableau de données sur la console


Les chaînes de caractères Les chaînes formatées « à la C »