Aller au contenu

f-string

f-string

Placer un f devant une chaîne de caractères permet d'intégrer les valeurs de variables dans la chaîne.

>>> a = 5
>>> b = 6
>>> chaine = f"a a pour valeur {a} et b a pour valeur {b}."
>>> chaine
'a a pour valeur 5 et b a pour valeur 6.'

Cette notation est très pratique pour avoir des messages explicites.

.format()

Cette possibilité n'a été introduite qu'à la version 3.6 de Python. Pour une version antérieure à la 3.6, on utilisera format (moins lisible):

>>> a = 5
>>> b = 6
>>> chaine = "a a pour valeur {} et b a pour valeur {}.".format(a, b)
>>> chaine
'a a pour valeur 5 et b a pour valeur 6.'

Cette méthode .format() est toujours utilisable pour les versions python >= 3.6 et peut parfois être utile.

Concaténation et conversion

On peut également utiliser la concaténation de chaînes et la conversion de types pour aboutir à la même chaîne:

>>> a = 5
>>> b = 6
>>> chaine = "a a pour valeur " + str(a) + " et b a pour valeur " + str(b) + "." 
>>> chaine
'a a pour valeur 5 et b a pour valeur 6.'

Exercice 1

Écrire un corps possible pour la fonction

def repeter(ch, effectif):
    """
    ch -- de type str
    effectif -- entier, >0

    renvoie la chaîne constituée de effectif copies de ch concaténées.
    >>> repeter('*', 3)
    '***'
    >>> repeter('cou', 2)
    'coucou'
    """
Le principe

Encore le principe accumulateur !

La variable d'accumulation est initialisée à la chaîne vide... à vous d'imaginer la suite.

pseudo-code
fonction repeter(chaine, nb):
    resultat  ← chaîne vide
    Pour k allant de 1 à nb: 
        resultat ← concaténation de resultat et chaine
    renvoyer resultat
Un code possible
def repeter(ch, effectif):
    """
    ch -- de type str
    effectif -- entier, >0

    renvoie la chaîne constituée de effectif concaténation de ch.
    >>> repeter('*', 3)
    '***'
    >>> repeter('cou', 2)
    'coucou'
    """
    resultat = ''
    for k in range(effectif):
        resultat = resultat + ch
    return resultat

Remarque.
On peut écrire resultat += ch à la place de resultat = resultat + ch. A vous de décider laquelle des deux écritures vous préférez.

Remarque.
Dans le pseudo-code, l'indice k allait de 1 à effectif. Dans le code python, on va ici de 0 à effectif-1. Comme la valeur de k lors des passages dans la boucle n'est pas utlisée, cela ne change rien: cette variable ne sert qu"à compter qu'il y ait bien exactement effectif copies de la chaîne.

Avec un f string

L'usage d'un f-string n'apporte rien ici, mais cherchez à réécrire le code précédent avec un f-string vous permettra de mieux intégrer la syntaxe.

Un code possible:

def repeter(ch, effectif):
    """
    ch -- de type str
    effectif -- entier, >0

    renvoie la chaîne constituée de effectif concaténation de ch.
    >>> repeter('*', 3)
    '***'
    >>> repeter('cou', 2)
    'coucou'
    """
    resultat = ''
    for k in range(effectif):
        resultat = f"{resultat}{ch}"
    return resultat

Exercice 2

Écrire un code possible pour le corps de la fonction suivante:

def etoile(n):
    """
    n -- entier naturel > 0

    renvoie une chaine triangle d'étoiles
    >>> print(etoile(3))
    *
    **
    ***
    >>> print(etoile(4))
    *
    **
    ***
    ****
    """

Attention

Utilisez la fonction de l'exercice précédent pour simplifier la tâche de celui-ci.

Ce conseil est un conseil de bonne pratique à respecter:
décomposer toute tâche en plus petites tâches réparties dans des fonctions.

Ce découpage en petites fonctions permet:

  • une meilleure lisibilité du code, le nom des fonctions étant choisi de façon à expliciter leur rôle.
  • une correction plus facile: chaque fonction peut être pensée séparément. Chacune ayant une petite tâche élémentaire, elle sera plus facile à concevoir et à corriger.

Passer à la ligne

On rappelle qu'un passage à la ligne s'obtient en ajoutant \n à la chaîne de caractères.

Un code possible

On utilise la fonction de l'exercice précédent.

def etoile(n):
    """
    n -- entier naturel > 0

    renvoie une chaine triangle d'étoiles
    >>> print(etoile(3))
    *
    **
    ***
    >>> print(etoile(4))
    *
    **
    ***
    ****
    """
    ch = ''
    for i in range(1, n+1):
        ch = ch + repeter('*', i) + "\n"
    return ch
Avec un f-string

(avec un python de version >= 3.6)

def etoile(n):
    """
    n -- entier naturel > 0

    renvoie une chaine triangle d'étoiles
    >>> print(etoile(3))
    *
    **
    ***
    >>> print(etoile(4))
    *
    **
    ***
    ****
    """
    ch = ''
    for i in range(1, n+1):
        ch = f"{ch}{repeter('*', i)}\n"
    return ch