Partage
  • Partager sur Facebook
  • Partager sur Twitter

vérifier l'existence d'une variable

    9 octobre 2010 à 13:57:39

    Bonjour, je m'entraîne sur les conditions et les fonctions et j'ai fais le petit jeu classique du plus ou moins:
    def plus_ou_moins():
        print("Entrez un nombre")
    
        import random
        resultat = random.randint(1,100)
        nombre = input()
        nombre = int(nombre)
    
        
            while nombre != resultat:
                if nombre < resultat:
                    print("non, c'est plus")
                elif nombre > resultat :
                    print("non, c'est moins")
                nombre = input()
                nombre = int(nombre)
            if nombre == resultat:
                print("Félicitaion, tu as trouvé le nombre magique!")
    
    plus_ou_moins()
    


    Sauf que quand je n'entre pas de nombre, ça m'afficher bien sûr une erreur. Comment vérifier l'existence d'une variable et faire "si la variable est vide, alors faire ceci".
    J'ai déjà fait des recherches mais rien trouvé de concret :(
    Merci :)
    • Partager sur Facebook
    • Partager sur Twitter
      9 octobre 2010 à 14:02:22

      Plutôt que de répondre directement, un petit indice.
      Ouvre un shell python, tape "nombre = input()", ne rentre pas de nombre, et regarde la valeur de <nombre>.
      Voilà, tu sais maintenant ce que vaut une variable "non initialisée", tu n'as plus qu'à rajouter le bon test dans un if. ;)

      En principe, tu devrais voir un autre problème survenir (là, on ne gère que le cas où l'on ne rentre rien du tout), mais chaque chose en son temps : il sera plus formateur de t'aiguiller pas à pas.
      • Partager sur Facebook
      • Partager sur Twitter
      Zeste de Savoir, le site qui en a dans le citron !
        9 octobre 2010 à 14:06:26

        Tu peux regarder si ta variable est dans les variables locales, en mettant dans ta fonction if 'variable' in locals(): #fais ce que tu veux, comme créer la variable

        1 - A utiliser avec modération
        2 - locals() te renvoie les variables locales, dans une fonction. Il existe aussi la fonction globals , qui te renvoie les variables globales.
        • Partager sur Facebook
        • Partager sur Twitter
          9 octobre 2010 à 14:08:38

          NohHaR : j'obtient ''. Je dois partir, je reviens dans 3h.
          ordiclic : j'ai pas le temps de comprendre ton message, je le relirais plus tard.

          Merci à vous deux! :D
          • Partager sur Facebook
          • Partager sur Twitter
            9 octobre 2010 à 14:16:27

            Pour voir comment ça fonctionne, regarde :
            >>> locals()
            {'__builtins__': <module 'builtins' (built-in)>, '__name__': '__main__', '__doc__': None, '__package__': None}
            >>> the_game = "lost"
            >>> locals()
            {'__builtins__': <module 'builtins' (built-in)>, '__package__': None, '__name__': '__main__', 'the_game': 'lost', '__doc__': None}
            >>>
            

            A la cinquième ligne, dans le dictionnaire retourné par locals() il y a une nouvelle clé, qui correspond à la variable créée précédemment.
            • Partager sur Facebook
            • Partager sur Twitter
              9 octobre 2010 à 14:19:21

              Citation : ordiclic


              >>> the_game = "lost"
              




              FFFFFFFFFFFFFFFFFFFFFFFFFUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU :colere:
              • Partager sur Facebook
              • Partager sur Twitter
              Zeste de Savoir, le site qui en a dans le citron !
              Anonyme
                9 octobre 2010 à 14:23:38

                Et le PO pourrait faire un simple try, except NameError ...
                • Partager sur Facebook
                • Partager sur Twitter
                Anonyme
                  9 octobre 2010 à 16:46:32

                  Dans le cas présent, il ne s'agit pas vraiment de vérifier si une variable existe ou non, mais plutôt de vérifier le contenu de la variable.

                  De ce fait, NoHaR à la meilleur solution.

                  Même si c'est hors sujet, il est aussi bon de savoir que l'on peut vérifier la présence d'une variable (un identifiant) avec les fonctions globals() ou locals() , ou encore, en gérant une exception NameError . Toutes fois, l'une de ces deux méthodes est plus "pythonic" que l'autre... ;)
                  • Partager sur Facebook
                  • Partager sur Twitter
                    9 octobre 2010 à 16:52:14

                    Oui, ne confonds pas une variable qui contient None et une variable qui n'est pas définie. Vérifier qu'une variable existe, c'est dangereux et assez moche.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      9 octobre 2010 à 18:07:09

                      from random import randint
                      
                      def plus_ou_moins(numberToFound=randint(1, 100)):
                          number = str(input('Entrez un nombre : '))
                          while not number.isdigit():
                              number = input('Entrez une valeur correcte (digitale) :')
                          number = int(number)
                          while number != numberToFound:
                              if number < numberToFound:
                                  print('Non, c\'est plus!')
                              elif number > numberToFound:
                                  print('Non, c\'est moins!')
                              number = input('Essayez encore : ')
                          print('Félicitations, tu as trouvé que le nombre mystère était le %i !' % numberToFound)
                      
                      • Partager sur Facebook
                      • Partager sur Twitter
                      Anonyme
                        9 octobre 2010 à 20:33:36

                        from random import randint
                        def test(n, nb_alea):
                            dico={-1:"trop petit", 0:"gagne", 1:"trop grand"}
                            return dico[cmp(n, nb_alea)]
                        
                        nb_alea=randint(1, 100)
                        while 1:
                            try: res=test(int(raw_input("Entre ton nombre :")), nb_alea)
                            except: continue
                            print res
                            if res=="gagne": break
                        


                        Ca doit être berk aussi non maxibolt? ;)
                        • Partager sur Facebook
                        • Partager sur Twitter
                          9 octobre 2010 à 21:02:48

                          Le premier, c'est principalement à cause du input en fait.
                          Pour le tien, évite le style inline et cette manie d'utiliser des dictionnaires pour jouer le rôle d'une liste, et ce sera très bien. Et hum, while 1 devrait plutôt s'écrire while True.
                          • Partager sur Facebook
                          • Partager sur Twitter
                            9 octobre 2010 à 21:14:58

                            from random import randint
                            def test(n, nb_alea):
                                dico={-1:"trop petit", 0:"gagne", 1:"trop grand"}
                                return dico[cmp(n, nb_alea)]
                            
                            nb_alea=randint(1, 100)
                            win = false
                            while not win:
                                try: res=test(int(raw_input("Entre ton nombre :")), nb_alea)
                                except: continue
                                print res
                                if res=="gagne": win = true
                            

                            Je trouve ça moins beurk que d'utiliser une boucle infinie déjà ^^
                            • Partager sur Facebook
                            • Partager sur Twitter
                            Anonyme
                              9 octobre 2010 à 21:33:33

                              Ton code (sans les erreurs de syntaxe) est identique au précédents mais en plus long et moins "pythonic"...

                              Il n'est pas utile de définir une variable win puisque tu peux tout simplement sortir de la boucle avec un break.

                              while True:
                                  if raw_input("Comment sortir de cette boucle ? : "):
                                      pass # ou continue
                                  else:
                                      break
                              
                              ;)

                              FMIS@Menace, Pourquoi str(input()) ? o_O
                              • Partager sur Facebook
                              • Partager sur Twitter
                                9 octobre 2010 à 21:45:16

                                non mais c'est quoi tout ces IF ? Vous ne connaissez pas cmp()

                                from random import randint
                                soluce = str(randint(1,100))
                                propose = ''
                                while propose != soluce:
                                    propose = ''
                                    while not propose.isdigit(): propose = raw_input('entrez un nombre entre 1 et 100:')
                                    print ("bravo, tu as trouve","non, c'est plus petit","non, c'est plus grand")[cmp(int(propose),int(soluce))]
                                
                                • Partager sur Facebook
                                • Partager sur Twitter

                                Python c'est bon, mangez-en. 

                                  9 octobre 2010 à 21:52:05

                                  Je propose, pour ma part, sans boucle pour faire quelque chose d'original et d'amusant :

                                  from random import randrange as rand
                                  
                                  def plusmoins(nbr,msg=None):
                                      if 1 == 2:
                                          print('You lose the Game')
                                      if msg:
                                          print(msg)
                                      try:
                                          nbi = int(input("Entrez un nombre : "))
                                          if nbi == nbr :
                                              return "Gagné !"
                                      except Exception:
                                          return plusmoins(nbr,"Ce n'est pas un nombre.")
                                      return plusmoins(nbr,"Plus grand.") if nbi < nbr else plusmoins(nbr,"Plus petit.")
                                  
                                  print(plusmoins(rand(100)))
                                  

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    9 octobre 2010 à 21:55:41

                                    @ordiclic ...
                                    c'est mal: RuntimeError: maximum recursion depth exceeded
                                    • Partager sur Facebook
                                    • Partager sur Twitter

                                    Python c'est bon, mangez-en. 

                                      9 octobre 2010 à 21:58:05

                                      josmiley : oui, mais l'intérêt est de montrer ce que ça pourrait donner dans une implémentation dans un langage n'employant pas de boucle, tel que Haskell. Je sais que la récursion n'et pas le fort de python, mais c'est pour l'algo ici.
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                      Anonyme
                                        9 octobre 2010 à 22:07:54

                                        cmp() n'existe plus en Python 3 ! ;)
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                        Anonyme
                                          9 octobre 2010 à 22:08:58

                                          from random import randint
                                          
                                          nb_alea=randint(1, 100)
                                          while True:
                                              try:
                                                  res=["trop petit", "gagne", "trop grand"][(cmp(int(raw_input("Entre un nombre :")), nb_alea))+1]
                                                  print res
                                              except: continue
                                              if res=="gagne": break
                                          


                                          Avec quelques modifs
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            9 octobre 2010 à 22:24:32

                                            Citation : LeYan'tibus

                                            FMIS@Menace, Pourquoi str(input()) ? o_O



                                            En utilisant simplement input() , j'obtenais une erreur avec .isdigit() comme quoi un entier ne possède pas d'attribut .isidigt() ^^.
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              9 octobre 2010 à 22:26:44

                                              @ fred1599; bien vu pour le try/except ...
                                              from random import randint
                                              reponse = soluce = randint(1,100)
                                              while reponse:
                                                  try:
                                                      reponse = cmp(int(raw_input('entrez un nombre entre 1 et 100:')),soluce)
                                                      print ("bravo, tu as trouve","non, c'est plus petit","non, c'est plus grand")[reponse]
                                                  except: continue
                                              
                                              • Partager sur Facebook
                                              • Partager sur Twitter

                                              Python c'est bon, mangez-en. 

                                                9 octobre 2010 à 22:29:27

                                                FMIS@Menace. : en python3, tu n'as pas besoin de str après un input, et en python2, tu n'as pas à utiliser input, sous peine de mort.
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                Anonyme
                                                  9 octobre 2010 à 22:33:26

                                                  Citation : FMIS@Menace.

                                                  En utilisant simplement input() , j'obtenais une erreur avec .isdigit() comme quoi un entier ne possède pas d'attribut .isidigt() ^^.

                                                  Tu utilise Python 2 ?
                                                  Python 2 Python 3
                                                  input() eval(input())
                                                  raw_input() input()

                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    10 octobre 2010 à 2:06:41

                                                    Alors utilise raw_input.
                                                    • Partager sur Facebook
                                                    • Partager sur Twitter

                                                    vérifier l'existence d'une variable

                                                    × 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