Partage
  • Partager sur Facebook
  • Partager sur Twitter

Plus ou moins

Optimisation de code

    16 novembre 2010 à 22:04:58

    Bonsoir,
    Voici un petit programme que je viens de coder:

    from random import randrange
    retry = 1
    print("Le super jeu du nombre mystere")
    
    
    while retry == 1 :
    
        nombre_myst = randrange(100)
    
        print("Combien?")
        choix = input()
        choix = int(choix)
    
    
    
        while choix != nombre_myst :
    
            if choix > nombre_myst:
                print("c'est moins ! Reessayez")
                choix = input()
                choix = int(choix)
            else :
                print("C'est plus ! Reessayez")
                choix = input ()
                choix = int(choix)
    
        print("Bravo vous avez trouver le nombre mysterieux, vous devez vous sentir baleze non?")
        print("On rejoue ? 1/0")
        retry = input()
        retry = int(retry)
    


    Je voudrai savoir comment vous l'auriez optimiser.
    Enfin, comment auriez vous tester si la valeur entrée est bien un entier ? Je n'ai pas bien saisi les exceptions et je cherche des exemples.

    Merci d'avance
    bonne soirée ;)
    Arkon
    • Partager sur Facebook
    • Partager sur Twitter
      16 novembre 2010 à 23:07:15

      en 2.6
      from random import randrange
      while raw_input('"Y" pour (re)jouer: ').lower() == 'y':
          nombre_myst = randrange(100)
          r = 1
          while r:
              try:
                  r = cmp(int(raw_input('entrez un nombre 1-100: ')),nombre_myst)
                  print ("Bravo vous avez trouver le nombre mysterieux, vous devez vous sentir baleze non?",
                    "c'est moins ! Reessayez",
                    "C'est plus ! Reessayez")[r]
              except: print "entrez un nombre entier!"
      print "ciao"
      


      edit: ai remplacé
      while raw_input('"Y" pour (re)jouer: ') in 'yY':
      par
      while raw_input('"Y" pour (re)jouer: ').lower() == 'y':
      • Partager sur Facebook
      • Partager sur Twitter

      Python c'est bon, mangez-en. 

        16 novembre 2010 à 23:07:52

        Alors pour ce qui est d'écrire le code de manière plus concise, plutôt que te livrer une solution toute cuite, autant te montrer la voie :

        Je vois 2 lignes qui sont répétées 3 fois.
        Je pense qu'il y a moyen de :
        - ne les écrire qu'une seule fois.
        - les fondre en une seule ligne

        Sinon, pour ce qui est de la gestion des exceptions, je te renvoie vers le tutoriel Python de prolixe et 6prien, qui y consacre tout un chapitre.
        • Partager sur Facebook
        • Partager sur Twitter
        Zeste de Savoir, le site qui en a dans le citron !
          16 novembre 2010 à 23:08:09

          voila ton code un peu optimiser :p avec les controles d'érreurs (exception):
          from random import randrange
          retry = True
          print("Le super jeu du nombre mystere")
          
          while retry:
          
              nombre_myst = randrange(100)
              choix=int()
          
              while choix != nombre_myst :
                  print("Combien?")
                  choix = input()
                  try:
                      choix = int(choix)
                  except:
                      print("veuiller entrer un nombre entier!")
                      continue
          
                  if choix > nombre_myst:
                      print("c'est moins ! Reessayez")
                      continue
                  else :
                      print("C'est plus ! Reessayez")
                      continue
              print("Bravo vous avez trouver le nombre mysterieux, vous devez vous sentir baleze non?")
              print("On rejoue ? O/N")
              retry = input()
              if retry.lower()=="n" or retry.lower()=="non":
                  retry=False
          


          version 3.1.*
          • Partager sur Facebook
          • Partager sur Twitter
            16 novembre 2010 à 23:58:46

            Merci pour vos réponses je vais reprendre ça
            • Partager sur Facebook
            • Partager sur Twitter
              17 novembre 2010 à 0:46:59

              except sans préciser quelle exception on veut rattraper, c'est mal.
              • Partager sur Facebook
              • Partager sur Twitter
                17 novembre 2010 à 0:52:03

                Au lieu de faire
                choix = input()
                choix = int(choix)
                


                Tu peux faire directement
                choix = int(input())
                


                Pour ce qui est de la boucle tu peux faire une boucle infinie puis la breaké en fonction de la réponse de l'utilisateur.

                • Partager sur Facebook
                • Partager sur Twitter
                  17 novembre 2010 à 9:26:27

                  Je plussois la remarque de Maxibolt, et je parle en connaissance de cause (j'ai payé ce genre de négligence extrêmement cher en terme de debuggage). Dans un cas aussi simple, cela peut paraitre superflu, mais c'est vraiment une bonne habitude à prendre.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    17 novembre 2010 à 19:25:40

                    Citation

                    Pour ce qui est de la boucle tu peux faire une boucle infinie puis la breaké en fonction de la réponse de l'utilisateur.


                    C'est possible c'est vrai, je vais essayer. Mais "casser" une boucle pour terminer un programme je ne trouve pas ca elegant.

                    Citation



                    choix = int(input())



                    Merci pour ca ! C'est ce que je cherchais.


                    from random import randrange
                    print("Le super jeu du nombre mystere")
                    
                    
                    nombre_myst = randrange(100)
                    
                    print("Combien?")
                    
                    retry = True
                    while retry:
                        choix = int(input())
                    
                        if choix > nombre_myst:
                            print("c'est moins ! Reessayez")
                            choix = int(input())
                    
                        elif choix < nombre_myst :
                            print("C'est plus ! Reessayez")
                            choix = int(input ())
                    
                        else :
                            print("Victoire!")
                    
                    print("On rejoue ? O/N")
                    retry = input()
                    if retry.lower () == "n":
                        retry = False
                    


                    Voici ce que j'ai refait. Je n'ai pas encore pu le tester et je ferai les exceptions ce soir ou demain.
                    • Partager sur Facebook
                    • Partager sur Twitter
                    Anonyme
                      17 novembre 2010 à 20:05:31

                      Citation

                      C'est possible c'est vrai, je vais essayer. Mais "casser" une boucle pour terminer un programme je ne trouve pas ca elegant.



                      C'est tout le contraire

                      Pour ton code non testé, c'est normal qu'il faille sortir de la boucle pour proposer de continuer la partie? Parce-que je ne vois rien pour quitter cette boucle justement, ça me semble être une boucle infinie.

                      Il faudra donc revoir le placement de ce morceau de code

                      print("On rejoue ? O/N")
                      retry = input()
                      if retry.lower () == "n":
                          retry = False
                      


                      Qui puis-est si on rejoue, c'est dommage de ne plus voir print("Combien?")

                      Il faudrait donc replacer ceci dans ta boucle infinie.

                      Voila sinon c'est pas mal pour un début.

                      • Partager sur Facebook
                      • Partager sur Twitter
                        17 novembre 2010 à 21:04:28

                        from random import randrange
                        retry = True
                        print("Le super jeu du nombre mystere")
                        
                        
                        while retry :
                        
                            nombre_myst = randrange(100)
                        
                            print("Combien?")
                            choix = int(input())
                        
                            while nombre_myst != choix:
                        
                                if choix > nombre_myst:
                                    print("c'est moins ! Reessayez")
                                    choix = int(input())
                                else :
                                    print("C'est plus ! Reessayez")
                                    choix = int(input())
                        
                            print("Bravo!")
                            print("On rejoue ? O/N")
                            retry = input()
                            if retry.lower () == "n":
                                break
                        

                        Ce qui me dérange c'est qu'il y a trois fois

                        choix = int(input())
                        
                        Il doit y avoir un moyen de mettre en facteur.

                        Maintenant, je veux vérifier que "choix" est bien:
                        -un entier
                        - dans l'intervalle [0;100]

                        Ca peut être quelque chose comme ça: ?
                        try:
                                choix < 0
                                choix > 100
                        
                            except:
                                print("probleme d'intevalle")
                                choix = int(input())
                        
                        • Partager sur Facebook
                        • Partager sur Twitter
                          17 novembre 2010 à 21:10:07

                          Je dirait plutôt:
                          choix > 0
                          choix < 100
                          


                          Et tu peux diminuer le nombre de "int(input())" en faisant:
                          while nombre_myst != choix:
                          
                                  if choix > nombre_myst:
                                      print("c'est moins ! Reessayez")
                                  else :
                                      print("C'est plus ! Reessayez")
                                  choix = int(input())
                          

                          • Partager sur Facebook
                          • Partager sur Twitter
                          Anonyme
                            17 novembre 2010 à 21:35:48

                            while not value in range(1, 100): # tant que value n'est pas dans l'intervalle [0:100]

                            C'est mieux que de jouer avec les exceptions ici...
                            • Partager sur Facebook
                            • Partager sur Twitter
                            Anonyme
                              17 novembre 2010 à 22:03:38

                              Citation

                              Ce qui me dérange c'est qu'il y a trois fois

                              Code : Python - Sélectionner

                              1



                              choix = int(input())

                              Il doit y avoir un moyen de mettre en facteur.



                              Surtout pas, il y en a 2 qui n'ont rien à faire là, (j'avais oublié de te le signaler) étant donné que tu es dans une boucle infinie, si ton nombre n'est pas correcte, tu reviens au départ de la boucle, donc on réfléchi :)

                              Citation

                              Maintenant, je veux vérifier que "choix" est bien:
                              -un entier
                              - dans l'intervalle [0;100]



                              +1 LeYan'tibus
                              • Partager sur Facebook
                              • Partager sur Twitter
                                17 novembre 2010 à 23:42:41

                                Citation : LeYan'tibus

                                while not value in range(1, 100): # tant que value n'est pas dans l'intervalle [0:100]

                                C'est mieux que de jouer avec les exceptions ici...


                                Euh, ouais, non en fait. Déjà, on prend une chaîne de caractères en entrée, donc en l'état ça marche pas. Si on commence par la convertir en entier avant de tester l'appartenance, on retombe sur le même problème : qui dit que l'utilisateur a rentré un format correct ? Si on convertir la liste en liste de chaînes de caractères pour tester cette appartenance, il faudra tout de même convertir le nombre en question en entier après dans la boucle. On n'y gagne pas grand chose.
                                Et surtout, ça oblige à construire explicitement la liste entière en mémoire. Pour des grandes valeurs, ça va poser des problèmes.
                                • Partager sur Facebook
                                • Partager sur Twitter
                                Anonyme
                                  18 novembre 2010 à 0:13:11

                                  Anèfé... Autant pour moi...

                                  Donc dans tous les cas il faudra effectivement surveiller l'exception ValueError lors des conversions de l'entrée en entier et par la même occasion, s'assurer que le nombre est bien compris entre 0 et 100.

                                  On pourrait alors faire un truc de ce genre :
                                  # ...
                                  nb = 0
                                  while nb != nb_x:
                                      try:
                                          nb = int(input("Quel est le nombre mystère ? : "))
                                          if nb < 1 or nb > 99:
                                              raise ValueError
                                      except ValueError:
                                          print("entrez un nombre entier compris entre 0 et 100 !".upper())
                                          continue
                                      # ...
                                  


                                  Arkon, si tu ne sais pas ce que signifi raise disont simplement qu'il sert à déclancher une exception. Ici il déclanche une ValueError tout comme le ferai int(x) si x était une chaine de caractères ne contenant pas (uniquement) un nombre entier.
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    18 novembre 2010 à 8:20:48

                                    j'ai ajouté une ligne à mon 1er code pour vérifier l'interval [1-100]
                                    mais j'ai l'impression qu'on est pas tous daccord sur l'interval ...
                                    est-ce que c'est [0-99] ou [1-100] ?

                                    from random import randrange
                                    while raw_input('"Y" pour (re)jouer: ').lower() == 'y':
                                        r = nombre_myst = randrange(1,101)
                                        while r:
                                            try:
                                                c = int(raw_input('entrez un nombre [1-100]: '))-1
                                                r = cmp(c/(not c/100),nombre_myst)
                                                print (
                                                  "Bravo vous avez trouver le nombre mysterieux, vous devez vous sentir baleze non?",
                                                  "c'est moins ! Reessayez",
                                                  "C'est plus ! Reessayez"
                                                        )[r]
                                            except: print "attention! il faut entrer un nombre entier dans l'interval [1-100]"
                                    print "ciao"
                                    
                                    • Partager sur Facebook
                                    • Partager sur Twitter

                                    Python c'est bon, mangez-en. 

                                    Anonyme
                                      18 novembre 2010 à 9:51:54

                                      cmp() n'existe plus avec Python 3. Pour ce qui est de l'interval, vue que le nombre mystère est généré avec randrange(100) , il s'agira donc d'un nombre de 0 à 99 inclus. Personnellement, j'ai exclus 0 dans mon exemple mais c'est pas dur de modifier ça. ;)
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                      Anonyme
                                        18 novembre 2010 à 10:59:55

                                        Citation

                                        est-ce que c'est [0-99] ou [1-100] ?



                                        Le PO pourra gérer cela seul je pense :)

                                        Pour ce qui est des conditions de fonctionnement du code, je ferais ceci


                                        while True :
                                            try :
                                                choix = int(input("Entre un nombre entre 1 et 100 :"))
                                                if choix not in range(1, 101) :
                                                    print("attention! il faut entrer un nombre entier dans l'interval [1-100]")
                                                    continue           
                                                break
                                            except ValueError :
                                                continue
                                        
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          18 novembre 2010 à 11:28:43

                                          Citation : fred1599


                                          if choix not in range(1, 101) :
                                          

                                          o_O heu ... non seulement on génère une liste de 100 entrées, mais si choix vaut 100, on se tape 100 comparaisons ...

                                          if not 0<choix<101:
                                          
                                          • Partager sur Facebook
                                          • Partager sur Twitter

                                          Python c'est bon, mangez-en. 

                                          Anonyme
                                            18 novembre 2010 à 11:33:52

                                            Citation

                                            heu ... non seulement on génère une liste de 100 entrées, mais si choix vaut 100, on se tape 100 comparaisons ...



                                            Oui, c'est vrai ;)
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              18 novembre 2010 à 12:26:23

                                              Citation : LeYan'tibus

                                              cmp() n'existe plus avec Python 3.


                                              Certes la fonction n'est plus dans les builts-in, mais bon, c'est pas très compliqué à implémenter.

                                              Citation : Doc Python 3.0

                                              If you really need the cmp() functionality, you could use the expression (a > b) - (a < b) as the equivalent for cmp(a, b)

                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                18 novembre 2010 à 20:56:25

                                                voila mon code modifier:
                                                from random import randrange
                                                retry = True
                                                print("Le super jeu du nombre mystere")
                                                
                                                while retry:
                                                
                                                    nombre_myst = randrange(100)
                                                    choix=int()
                                                
                                                    while choix != nombre_myst :
                                                        print("Combien?")
                                                        try:
                                                            choix = int(input())
                                                        except:
                                                            print("veuiller entrer un nombre entier!")
                                                            continue
                                                        if choix<0 or choix>100:
                                                            print("entrez un nombre dans l'interval de 0-100")
                                                            continue
                                                
                                                        if choix > nombre_myst:
                                                            print("c'est moins ! Reessayez")
                                                            continue
                                                        elif choix<nombre_myst :
                                                            print("C'est plus ! Reessayez")
                                                            continue
                                                    print("Bravo vous avez trouver le nombre mysterieux, vous devez vous sentir baleze non?")
                                                    print("On rejoue ? O/N")
                                                    retry = input()
                                                    if retry.lower()=="n" or retry.lower()=="non":
                                                        retry=False
                                                print("fin de la partie.")
                                                


                                                Citation : Maxibolt

                                                except sans préciser quelle exception on veut rattraper, c'est mal.


                                                c'est pas nécessaire dans ce cas la, je pense.
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                Anonyme
                                                  18 novembre 2010 à 21:07:58

                                                  Ce n'est de toutes façons pas une bonne pratique d'utiliser except sans préciser l'exception que l'on veut attraper, même si visiblement ici il ne peut y avoir qu'une ValueError il faut prendre les bonnes habitudes dès le début !

                                                  En plus, par la suite tu pourrais avoir envie d'amméliorer ton script et donc devoir gérer d'autres exceptions...
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    18 novembre 2010 à 23:54:19

                                                    sans cmp() alors ...
                                                    from random import randrange
                                                    while raw_input('"Y" pour (re)jouer: ').lower() == 'y':
                                                        nombre_myst = randrange(1,101)
                                                        c = 0
                                                        while c!=nombre_myst:
                                                            try:
                                                                c = int(raw_input('entrez un nombre [1-100]: '))
                                                                print "c'est moins ! Reessayez" if nombre_myst<c<101 else\
                                                                      "c'est plus ! Reessayez"  if 0<c<nombre_myst   else\
                                                                      "Bravo vous avez trouver le nombre mysterieux, vous devez vous sentir baleze non?"
                                                            except: print "ce n'est pas une valeur valide!"
                                                    print "ciao"
                                                    

                                                    • Partager sur Facebook
                                                    • Partager sur Twitter

                                                    Python c'est bon, mangez-en. 

                                                      19 novembre 2010 à 0:54:32

                                                      Citation : na15

                                                      voila mon code modifier:

                                                      from random import randrange           # J'ai une préférence perso pour randint mais bon 
                                                      retry = True
                                                      print("Le super jeu du nombre mystere")
                                                      
                                                      while retry:
                                                      
                                                          nombre_myst = randrange(100)
                                                          choix = int()
                                                      
                                                          while choix != nombre_myst :
                                                              print("Combien ?")
                                                              try:
                                                                  choix = int(input())
                                                              except:
                                                                  print("veuiller entrer un nombre entier!")
                                                                  continue
                                                              if choix < 0 or choix > 100:
                                                                  print("entrez un nombre dans l'interval de 0-100")
                                                                  continue
                                                      
                                                              if choix > nombre_myst:
                                                                  print("c'est moins ! Reessayez")
                                                                  continue
                                                              elif choix<nombre_myst :
                                                                  print("C'est plus ! Reessayez")
                                                                  continue
                                                          print("Bravo vous avez trouver le nombre mysterieux, vous devez vous sentir baleze non?")
                                                          print("On rejoue ? O/N")
                                                          retry = input()
                                                          if retry.lower() in ("n", "non"): #Plus rapide.
                                                              retry=False
                                                      print("fin de la partie.")
                                                      



                                                      Citation : Maxibolt

                                                      except sans préciser quelle exception on veut rattraper, c'est mal.


                                                      c'est pas nécessaire dans ce cas la, je pense.

                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        19 novembre 2010 à 1:08:06

                                                        je suppose que randrange et randint ne sans pas trés différent alors ça donne le même résultat ;)
                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                          19 novembre 2010 à 5:21:13

                                                          Si, c'est toujours nécessaire de préciser l'exception. Pas forcément parce qu'on peut en rajouter après (on pourra alors rajouter le nom de l'exception à ce moment là), mais surtout parce qu'en ne mettant rien, on rattrape toutes les erreurs pouvant se produire. On croit souvent qu'il n'y en a qu'une, mais en réalité on peut ainsi continuer l'exécution du code en traitant des erreurs non prévues et en les masquant, et ça devient très difficile à débugger ensuite.
                                                          Par exemple, KeyboardInterrupt, c'est une exception.
                                                          • Partager sur Facebook
                                                          • Partager sur Twitter

                                                          Plus ou moins

                                                          × 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