IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Calcul scientifique Python Discussion :

Probleme : Verifier qu'une variable est bien un entier et pas un caractère


Sujet :

Calcul scientifique Python

  1. #1
    Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Février 2019
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Février 2019
    Messages : 67
    Points : 42
    Points
    42
    Par défaut Probleme : Verifier qu'une variable est bien un entier et pas un caractère
    Bonjour à tous,

    J'ai réalisé un programme qui affiche pour un entier "m" rentré par l'utilisateur et un flottant "b", une liste donnant les valeurs allant de "b puissance 0" jusqu'à "b puissance (m-1)". Le programme fonctionne et le code est donné ci-dessous.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    def calcul_ma_puissance(m,b):
     
        i=0
        puissance=0
        for nombre in range(m):
           puissance = b**i
           i=i+1
           liste.append(puissance)
     
        return(liste)
     
     
    m = int(input())
    b = float(input())
     
    liste =[]
    if isinstance(m,int) and isinstance(b,float):
       calcul_ma_puissance(m,b)
       print(liste)
     
    else:
      print("Type entré non valide !")
    Cependant, je voudrai que le programme exécute une condition supplémentaire:
    Si les valeurs entrées par l'utilisateur ne correspondant pas au type souhaité (par exemple l'utilisation rentre un flottant ou un caractère pour "m" et/ou un entier ou un caractère pour "b"), je souhaiterai que l'ordinateur renvoie un message du type : "Type entré non valide" plutôt que de renvoyer un message d'erreur.
    Pour faire cela, il semblerait, que avec Python 3.0, il faille utiliser l'instruction: "isinstance(var,type)", mais je n'arrive pas à modifier mon programme ci-dessus pour que cela fasse l'effet recherché.
    Quelqu'un serai-t-il capable de modifier le code en conséquence ? Merci, cela me servira pour d'autres problèmes également.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    L'utilisateur entre une chaîne de caractères retournée par input.
    Puis vous lui appliquez int ou float qui en essaieront d'en faire un entier ou un flottant ou remonteront l'exception ValueError si ne n'est pas possible.
    Un sujet peut être d'apprendre ce que sont les exceptions et de comment les gérer avec Python: voir le chapitre adhoc du tutoriel Python.
    Après, il y a d'autres sujets comme utiliser les expressions régulières pour reconnaître un nombre flottant (qui est bien plus qu'une suite de nombre séparée par ',' ou '.')

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre éprouvé
    Avatar de ABD-Z
    Homme Profil pro
    Ingé. webapps embarquées – Admin/mainteneur serveur/BDD – Formateur WordPress – Desiger : logo/site
    Inscrit en
    Septembre 2016
    Messages
    264
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingé. webapps embarquées – Admin/mainteneur serveur/BDD – Formateur WordPress – Desiger : logo/site

    Informations forums :
    Inscription : Septembre 2016
    Messages : 264
    Points : 945
    Points
    945
    Billets dans le blog
    2
    Par défaut
    Bonjour,
    Voici la solution:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    def calcul_ma_puissance(m,b):
     
        i=0
        puissance=0
        for nombre in range(m):
           puissance = b**i
           i=i+1
           liste.append(puissance)
     
        return(liste)
     
    while True:
    	try:
    		m = int(input())
    		b = float(input())
    		break
    	except:
    		print "Mauvais type de donnee rentre"
     
     
    liste =[]
    if isinstance(m,int) and isinstance(b,float):
       calcul_ma_puissance(m,b)
       print(liste)
     
    else:
      print("Type entre non valide !")
    Comme tu peux voir, j'ai mis un boucle "while True" contenant la gestion d'exception, si l'utilisateur rentre une chaîne de caractère, une exception (qui est en fait l'erreur en question) sera levée et puis le code reboucle jusqu'à ce qu'une bonne valeur soit rentré...
    Comme l'a dit wiztricks, apprend
    ce que sont les exceptions et de comment les gérer avec Python: voir le chapitre adhoc du tutoriel Python.
    N'oublie pas de mettre résolu

  4. #4
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 824
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 824
    Points : 7 120
    Points
    7 120
    Par défaut
    @ABD-Z

    La ligne 23 est inutile, car en sortie du try-except on aura forcément le type voulu après cast. Mais je pense que tu as zappé de modifier la suite du code, cependant je préfère prévenir le PO que cette suite est à retirer.

    Ligne 18, on évite le except seul en spécifiant exactement le type d'erreur attendu, en l'occurrence ici, ça sera une ValueError.
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  5. #5
    Membre éprouvé
    Avatar de ABD-Z
    Homme Profil pro
    Ingé. webapps embarquées – Admin/mainteneur serveur/BDD – Formateur WordPress – Desiger : logo/site
    Inscrit en
    Septembre 2016
    Messages
    264
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingé. webapps embarquées – Admin/mainteneur serveur/BDD – Formateur WordPress – Desiger : logo/site

    Informations forums :
    Inscription : Septembre 2016
    Messages : 264
    Points : 945
    Points
    945
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par fred1599 Voir le message

    La ligne 23 est inutile, car en sortie du try-except on aura forcément le type voulu après cast. Mais je pense que tu as zappé de modifier la suite du code, cependant je préfère prévenir le PO que cette suite est à retirer.
    Effectivement la ligne 23 est inutile du coup (j'ai pas fait gaffe).


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Ligne 18, on évite le except seul en spécifiant exactement le type d'erreur attendu, en l'occurrence ici, ça sera une ValueError.
    Concernant l'except, j'apprends un nouveau truc... Mais bon, ça marche là!^^ Et puis, si on connaît pas la nature de l'erreur on fait comment alors?

  6. #6
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 824
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 824
    Points : 7 120
    Points
    7 120
    Par défaut
    Et puis, si on connaît pas la nature de l'erreur on fait comment alors?
    Tu testes sur ton interpréteur préféré

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    >>> int('a')Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    ValueError: invalid literal for int() with base 10: 'a'
    >>> float('a')
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    ValueError: could not convert string to float: 'a'
    Mais bon, ça marche là
    C'est ce que tu crois, mais en faisant ce type syntaxe, tu rends la détection d'un autre type d'erreur impossible et totalement invisible.

    Un peu de lecture
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par ABD-Z Voir le message
    Mais bon, ça marche là!^^ Et puis, si on connaît pas la nature de l'erreur on fait comment alors?
    Si vous ne connaissez pas la nature de l'erreur, vous ne saurez que faire pour la traiter.... Donc elle remontera à l'appelant qui devra s'en débrouiller (ou pas).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  8. #8
    Membre du Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Février 2019
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Février 2019
    Messages : 67
    Points : 42
    Points
    42
    Par défaut
    Citation Envoyé par ABD-Z Voir le message
    Bonjour,
    Voici la solution:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    def calcul_ma_puissance(m,b):
     
        i=0
        puissance=0
        for nombre in range(m):
           puissance = b**i
           i=i+1
           liste.append(puissance)
     
        return(liste)
     
    while True:
    	try:
    		m = int(input())
    		b = float(input())
    		break
    	except:
    		print "Mauvais type de donnee rentre"
     
     
    liste =[]
    if isinstance(m,int) and isinstance(b,float):
       calcul_ma_puissance(m,b)
       print(liste)
     
    else:
      print("Type entre non valide !")
    Comme tu peux voir, j'ai mis un boucle "while True" contenant la gestion d'exception, si l'utilisateur rentre une chaîne de caractère, une exception (qui est en fait l'erreur en question) sera levée et puis le code reboucle jusqu'à ce qu'une bonne valeur soit rentré...
    Comme l'a dit wiztricks, apprend

    N'oublie pas de mettre résolu
    Merci beaucoup ! Je vais essayer cela de suite !

Discussions similaires

  1. Verifier si une variable est un nombre
    Par TheBlue dans le forum Dev-C++
    Réponses: 2
    Dernier message: 10/01/2008, 17h39
  2. Savoir si une variable est bien un chiffre
    Par tomasi dans le forum C
    Réponses: 34
    Dernier message: 15/11/2006, 13h15
  3. Réponses: 3
    Dernier message: 12/10/2006, 16h39
  4. Réponses: 3
    Dernier message: 03/07/2006, 12h25
  5. Vérifier qu'une variable est un nombre
    Par GLDavid dans le forum Linux
    Réponses: 9
    Dernier message: 13/02/2006, 16h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo