Leçon 18 / 20

Saisir et valider les dépenses

25 min Python — bases du langage Gratuit

Objectif : Construire une dépense à partir d’entrées utilisateur et refuser les montants invalides.

Une dépense saisie au clavier arrive d’abord sous forme de texte, même lorsque vous tapez un montant. Si vous tentez de calculer avec un montant qui n’a pas été converti en nombre, votre script ne peut pas traiter correctement la dépense. Vous allez recueillir les trois champs nécessaires, convertir le montant et recommencer la saisie lorsqu’il est invalide.

Le contrat fonctionnel défini précédemment prévoit que chaque dépense contienne un montant, une catégorie et une description, et qu’un montant non numérique ne soit pas accepté. Vous allez intégrer ce comportement dans le script existant sans modifier les trois dépenses déjà présentes ni la fonction qui les affiche.

Lire les valeurs saisies

La fonction input() affiche une question et attend que la personne saisisse une réponse. Elle renvoie toujours une chaîne de caractères : c’est pourquoi le montant doit être converti en float avant de rejoindre la liste des dépenses. Les deux autres réponses, la catégorie et la description, restent des chaînes.

Texte
montant_texte = input("Montant en euros : ")
montant = float(montant_texte)
categorie = input("Catégorie : ")
description = input("Description : ")

depense = {
    "montant": montant,
    "categorie": categorie,
    "description": description,
}

Si vous entrez 12.50, la variable montant contient un nombre décimal, tandis que les deux autres champs contiennent du texte. Le dictionnaire obtenu reprend les mêmes clés que les dépenses déjà utilisées dans le projet. Une saisie comme douze provoque toutefois une erreur lors de la conversion : vous devez intercepter ce cas pour éviter l’arrêt du script.

Redemander un montant invalide

Entourez la conversion par try et except ValueError. En cas d’erreur, affichez une indication et revenez à la question du montant grâce à la boucle while : les catégories et descriptions ne sont demandées qu’après obtention d’un montant valide. La boucle ne comporte ici qu’un seul point de sortie, après une conversion réussie.

Mettre à jour le script complet

Le fichier ci-dessous reprend l’état de la leçon « Organiser les responsabilités » : les trois dépenses initiales, l’affichage avec sous-total et le point d’entrée restent en place. La nouvelle fonction demande une dépense et renvoie son dictionnaire ; main() conserve le sous-total initial, puis ajoute la dépense saisie seulement après sa validation.

Texte
depenses = [
    {"montant": 12.50, "categorie": "Repas", "description": "Déjeuner"},
    {"montant": 8.90, "categorie": "Transport", "description": "Bus"},
    {"montant": 24.00, "categorie": "Courses", "description": "Marché"},
]


def afficher_depenses(liste_depenses, devise="€"):
    sous_total = 0
    for depense in liste_depenses:
        montant = depense["montant"]
        sous_total += montant
        print(
            f"{montant:.2f} {devise} - "
            f"{depense['categorie']} : {depense['description']}"
        )
    return sous_total


def saisir_depense():
    while True:
        montant_texte = input("Montant en euros : ")
        try:
            montant = float(montant_texte)
            break
        except ValueError:
            print("Montant invalide : saisissez un nombre, par exemple 12.50.")

    categorie = input("Catégorie : ")
    description = input("Description : ")
    return {
        "montant": montant,
        "categorie": categorie,
        "description": description,
    }


def main():
    print("Dépenses enregistrées :")
    sous_total = afficher_depenses(depenses)
    print(f"Sous-total initial : {sous_total:.2f} €")

    nouvelle_depense = saisir_depense()
    depenses.append(nouvelle_depense)
    print("Dépense ajoutée :")
    afficher_depenses([nouvelle_depense], "EUR")


if __name__ == "__main__":
    main()
Résultat attendu
Exemple avec les réponses 15.20, Loisirs et Livre :
Dépenses enregistrées :
12.50 € - Repas : Déjeuner
8.90 € - Transport : Bus
24.00 € - Courses : Marché
Sous-total initial : 45.40 €
Dépense ajoutée :
15.20 EUR - Loisirs : Livre

Lancez le script et saisissez d’abord abc comme montant : le message d’erreur s’affiche et le script demande à nouveau le montant. Entrez ensuite un nombre, puis une catégorie et une description ; seule cette dépense valide est ajoutée à la liste. La saisie actuelle valide la conversion numérique, mais ne vérifie pas encore les montants négatifs ou les champs laissés vides.

À retenir

  • input() renvoie du texte ; convertissez le montant avec float() pour le traiter comme un nombre.
  • Interceptez ValueError avec try et except afin qu’une conversion invalide ne stoppe pas le programme.
  • Répétez la demande du montant tant que la conversion échoue, puis construisez le dictionnaire avec les trois champs attendus.
  • Ajoutez à la liste uniquement le dictionnaire produit après une saisie numérique valide.

Dans la prochaine leçon, vous calculerez et vérifierez les totaux par catégorie à partir des dépenses enregistrées.

Envie d'aller plus loin ?

Les cours Enovatic sont gratuits et le resteront. Si vous cherchez un accompagnement encadré, nos formations professionnelles sont animées par les mêmes formateurs.