Résolue

Nombre positif

# Boucles # Structures conditionnelles # Exercices

Je realise des excercices du livre " 100 exercices PYTHON pour s'entrainer".
l'exercice 6 demande en gros de tester une valeur et le resultat doit tester si le nombre est positif ou negatif.

Et j'ai voulue trouver comment controler la saisie utilisateur.
j'ai tesé plien de chose avec des boucles avec des list des isdigit etc .....

Mais cela fonctionnais mal avec les caractere speciaux ou autre "enfin je n'ai pas trouvé de solution".

Et en cherchant solution je suis tomber sur la gestion d'erreur "Try except" et j'ai vue des tuto sur les Fonction.

Donc j'ai melanger tous ça :
Dite moi si j'en est fait un bon usage, merci:

# 12/05/2024
# exercice qui teste un nombre positif ou negatif
# premiere uutilisation de fonction et Try except (gestion erreur).


# teste de saisie utilisateur 
# premier teste de convertion (int) possible
def teste_nb(nb):
    try:
        nb = int(nb)
        print(f"La chaîne '{nb}' a été convertie en entier.")
        test_nb_pos(nb)
    except ValueError:
        print("----→ Erreur ←----")
        print("La chaîne ne représente pas un entier.")
        print("----→ Recommencer svp ←----")
        user_nb()

# teste du nombe positif ou non
def test_nb_pos(nb):
    if nb > 0 :
        print(f"le nombre {nb} est un nombre positif !")
    elif nb < 0 :
        print(f"{nb} est un nombre negatif !")
    else:
        print(f"{nb} est égale à False ")

def user_nb():
    teste_nb(input("entre un nombre : ".capitalize()))
# le programme demare ici
user_nb()

# fin

Thibault houdon

Mentor

Bonjour Claude,

C'est un très bon début bravo !

Voici une correction que je te propose :

from textwrap import dedent


def verification(nombre: str) -> int:
    try:
        nombre = int(nombre)
        print(f"La chaîne '{nombre}' a été convertie en entier.")
        return nombre
    except ValueError:
        print(dedent("""
        ----→ Erreur ←----
        La chaîne ne représente pas un entier.
        ----→ Recommencer svp ←----
        """))


def verification_positif(nombre: int) -> None:
    if nombre > 0:
        print(f"le nombre {nombre} est un nombre positif !")
    elif nombre < 0:
        print(f"{nombre} est un nombre negatif !")
    else:
        print(f"{nombre} est égale à 0")


if __name__ == '__main__':
    nombre = None
    while nombre is None:
        nombre = verification(input("entre un nombre : ".capitalize()))

    verification_positif(nombre)

En règle générale :

  • Attention à ne pas trop utiliser les fonctions et à les utiliser pour réaliser une seule action.

    • Dans ton cas, ta fonction teste_nb essayait de convertir le nombre, puis d'exécuter une action en conséquence. J'ai enlevé cette logique pour la mettre dans la boucle principale (voir le glossaire __name__). Ainsi, ta fonction ne fait qu'une chose : essayer de convertir le nombre sous forme de chaîne de caractères en entier.
  • Pareil pour la logique principale, là c'était confus tu avais une fonction user_nb avec une seule ligne de code, qui appelle la fonction teste_nb, et cette fonction appelle à son tour la fonction user_nb dans le cas où tu n'entres pas un nombre. Ça fait du code éparpillé et c'est difficile de suivre le chemin de ton script. En suivant le principe qu'une fonction ne doit réaliser qu'une action, ça permet de mieux comprendre ce que font les fonctions et d'avoir la logique au même endroit (dans mon cas, dans la boucle while).

  • N'hésite pas à nommer explicitement les objets dans ton script. nb -> nombre ou number, pos -> positif. Aujourd'hui on a de la place sur nos écrans et il est toujours préférable d'être le plus explicite possible pour que le script soit facile à lire et comprendre.

Également, j'ai ajouté une petite fonction bien pratique : dedent, qui permet de mettre tout dans un print et de ne pas afficher les indentations.

Voilà pour la correction, bonne continuation !

Bonjour Thilbaut,

Dans les definitions des fonctions il y a après les parametres
-> None:
et
-> int:
Qui m'intrigue...., je vais etudier tous ça en te remerciant bien Thilbaut.

:)

Inscris-toi

(c'est gratuit !)

Inscris-toi

Tu dois créer un compte pour participer aux discussions.

Créer un compte

Rechercher sur le site

Formulaire de contact

Inscris-toi à Docstring

Pour commencer ton apprentissage.

Tu as déjà un compte ? Connecte-toi.