Partage
  • Partager sur Facebook
  • Partager sur Twitter

Lever une exception si l'input est un nombre

Sujet résolu
    24 septembre 2018 à 20:47:28

    Bonjour, je voudrais entrer une exception ValueError seulement si l'entier est un nombre mais je n'y arrive pas.
    Voici le bout de code en question :

    try:
    choix_de_la_lettre = input("Quel sera votre choix de lettre n°{}: ".format(i))
    test = str(choix_de_la_lettre)
    except ValueError:
    "Je peux vous garantir qu'il n'y a pas de chiffre dans les mots proposés."
    continue

    Je pense que au final même quand je rentre un chiffre l'input le converti en "str" ce qui fait que mon test est vrai quoiqu'il arrive, si je tente test = int(choix_de_la_lettre) cela sera vrai également, idem pour float ... comment faire?

    Merci d'avance

    • Partager sur Facebook
    • Partager sur Twitter
      24 septembre 2018 à 21:55:42

      Pour vérifier que saisie ne comporte pas de nombre :

      def contiens_nombre(saisie: str) -> bool:
      
          return any([char.isdigit() for char in saisie])
      
      # explications:
      
      # on utilise str.isdigit
      
      "e".isdigit() # = False
      "8".isdigit() # = True
      
      # on utilise les compréhensions de liste
      
      saisie = "hey5u"
      chars = [char.isdigit() for char in saisie]
      # chars = [False, False, False, True, False]
      
      # on utilise any qui renvoie True si au moins un élément de l’itérable que l’on lui passe en paramètre est True
      
      

      À partir de ça tu devrais pouvoir te débrouiller.

      Autre chose :

      int("34") # ok
      int("salut") # lève ValueError

      Je ne sais pas si ça aide, car je ne suis pas sûr de comprendre le problème.


      -
      Edité par digammaF 24 septembre 2018 à 22:01:18

      • Partager sur Facebook
      • Partager sur Twitter

      typage structurel ftw

        24 septembre 2018 à 22:20:28

        Paulad a écrit:

        Je pense que au final même quand je rentre un chiffre l'input le converti en "str" ce qui fait que mon test est vrai quoiqu'il arrive

        La fonction input ne converti rien, c'est justement pour ça que tu récupères une chaine de caractères. Au contraire quand tu veux récupérer un entier, il faut regarder si les caractères entrés par l'utilisateurs correspondent à un nombre ou pas.

        Paulad a écrit:

        si je tente test = int(choix_de_la_lettre) cela sera vrai également, idem pour float ... comment faire?

        C'est pas un test que tu fais, c'est une conversion, ça ne renvoie pas de booléen. Si tu veux un test toutes les infos sont dans le post de digammaF.

        • Partager sur Facebook
        • Partager sur Twitter

        Blond, bouclé, toujours le sourire aux lèvres...

          25 septembre 2018 à 10:57:47

          Voici l'énoncé de mon problème formulé de manière littérale :

          Dans le cadre du jeu du pendu, l'utilisateur est invité a rentrer une lettre. Si la lettre est un chiffre je voudrais afficher (lever une exception?) pour informer l'utilisateur qu'il n'y a pas de chiffres dans les mots proposés pour le jeu.

          LoupSolitaire -> je suis conscient que ce n'est pas un test mais de cette manière, si la convertion n'était pas possible cela devrait lever une erreur non ? Et c'est la mon blocage c'est que je ne sais pas comment lever une erreur de cette façon.

          Le truc c'est que je ne comprends pas tres bien la solution de digammaF vu les connaissances que j'ai acquis jusqu'ici. Je comprends le isdigit mais pas la définition de la fonction...

          Pour le moment je suis au boulot et ne peut malheureusement faire des tests supplémentaires.

          En tous cas je vous remercie d'avoir pris le temps de me repondre malgré un énoncé du probleme qui n'était effectivement pas tres clair.

          -
          Edité par Paulad 25 septembre 2018 à 10:59:11

          • Partager sur Facebook
          • Partager sur Twitter
            25 septembre 2018 à 14:45:55

            Salut !

            Tu te compliques la vie ! Un code tout simple:

            choix = input('Lettre n°{}: '.format(i))
            
            # On vérifie que choix existe et qu'il n'est pas un nombre.
            if choix and not choix[0].isdigit():
            	# On ne prend que la première lettre de la saisie utilisateur.
            	lettre = choix[0]
            else:
            	print('Entrée invalide')

            Tu n'as besoin d'exercer un controle que sur la première lettre de la saisie puisque l'utilisateur entre les lettres une par une.

            Donc tu dois vérifier que l'utilisateur a saisi quelque chose et que ce quelque chose commence par une lettre.

            Bonne continuation :)

            • Partager sur Facebook
            • Partager sur Twitter
              25 septembre 2018 à 18:55:34

              Pour faire simple :

              def entrer_lettre(question: str) -> str:
              
                  saisie = inout(question)
              
                  if len(saisie)!=1:
                      print(‘UNE lettre !’)
                      return entrer_lettre(question)
              
                  if saisie.isdigit():
                      print(‘Pas un nombre, une LETTRE !’)
                      return entrer_lettre(question)
              
                  return saisie # on est sûrs que saisie comporte une lettre et n’est pas un nombre. Ça pourrait être, par exemple ( ou €.

              -
              Edité par digammaF 25 septembre 2018 à 19:23:07

              • Partager sur Facebook
              • Partager sur Twitter

              typage structurel ftw

                25 septembre 2018 à 19:19:47

                Merci a vous !!

                EDIT : Finalement le problème n'est pas résolu parce que mon test est dans une boucle while et avec un if la boucle continue son chemin hors je voudrais réinviter l'utilisateur à refaire son input avant que le tour de boucle s'effectue.

                -
                Edité par Paulad 25 septembre 2018 à 21:36:38

                • Partager sur Facebook
                • Partager sur Twitter
                  26 septembre 2018 à 19:25:31

                  EDIT : Finalement le problème n'est pas résolu parce que mon test est dans une boucle while et avec un if la boucle continue son chemin hors je voudrais réinviter l'utilisateur à refaire son input avant que le tour de boucle s'effectue.

                  Voici la partie du code concerné :

                      i = 1
                      while i <= 8:
                          try:
                              choix_de_lettre = (input("Veuillez choisir la lettre n°{}".format(i)))
                              if choix_de_lettre.isdigit():
                                  raise ValueError
                          except ValueError:
                              print("Il n'y a pas de nombre dans les mots utilisés")
                          i += 1


                  Ici, quand je tape un chiffre, à la lettre n°2, je souhaiterais que la boucle ne fasse pas un tour et réaffiche donc "Veuillez choisir la lettre n°2"

                  J'ai essayé vos méthodes mais le problème reste le même, la boucle fait quand même un tour..

                  -
                  Edité par Paulad 26 septembre 2018 à 19:32:32

                  • Partager sur Facebook
                  • Partager sur Twitter
                    26 septembre 2018 à 20:13:01

                    Faire des tours de boucle, c'est pas un problème dans ton cas, au contraire puisque tu dois redemander une lettre à l'utilisateur.

                    Le problème c'est l'incrémentation de i.

                    • Partager sur Facebook
                    • Partager sur Twitter

                    Blond, bouclé, toujours le sourire aux lèvres...

                      26 septembre 2018 à 21:03:36

                      Merci beaucoup j'ai enfin compris... Vieux motard que jamais !
                      • Partager sur Facebook
                      • Partager sur Twitter

                      Lever une exception si l'input est un nombre

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                      • Editeur
                      • Markdown