Partage
  • Partager sur Facebook
  • Partager sur Twitter

Choix restreint ?

Sujet résolu
    4 mars 2013 à 12:49:40

    Bonjour à vous ! J'aurais deux questions assez simples je suppose pour les experts que vous êtes :)

    choix = int(input("1 ou 2 ? : "))
    if choix == 1 :
        print("Salut c'est cool !")
    elif choix == 2 :
        print("Salut c'est aussi cool !")

    J'aimerais que dans cet input(c'est un exemple), l'utilisateur ne puisse que rentrer 1 ou 2, sinon cela lui dirait que ce choix n'existe pas. Comment faire , a part passer par une boucle ou je devrais écrire tous les choix possible, cela devient vite encombrant quand il y a beaucoup de choix ? J'aimerais passer par les exceptions mais je n'ai pas très bien compris ...

    Sinon deuxième question dans le même genre, j'aimerais aussi savoir comment faire pour que dans un input l'utilisateur ne puisse rentrer que des entiers, si il entre une chaîne de caractère cela lui mettrai une erreur. 

    Merci de m'avoir lu et j'espère que vous aurez des réponses clairs et simples car je ne suis pas un expert ! Oh et je suis sous 3.3 aussi !

    • Partager sur Facebook
    • Partager sur Twitter
    "The best thing about now, is that there's another one tomorrow."
      4 mars 2013 à 13:03:17

      Je pense que ce que tu cherches à faire c'est quelque chose comme ceci:

      if choix in range(1,2):
          print("OK")
      else:
          print("KO")
      

      Et bien sûr, pour en savoir plus -> la doc

      -
      Edité par PyTony 4 mars 2013 à 13:04:41

      • Partager sur Facebook
      • Partager sur Twitter
      Envie de mettre les mains dans le cambouis ? Passez à Funtoo GNU/Linux. DO IT!
        4 mars 2013 à 13:04:44

        Voila le code que je te proposes:

        while True:
            choice = input("1 or 2? : ")
            if choice not in ['1', '2']:
                print("Illegal input")
            else:
                break
        choice = int(choice)
        
        # Ton code:
        if choice == 1 :
            print("Salut c'est cool !")
        elif choice == 2 :
            print("Salut c'est aussi cool !")
        
        Bonne journee!

        -
        Edité par stackOverflow 4 mars 2013 à 13:18:18

        • Partager sur Facebook
        • Partager sur Twitter
          4 mars 2013 à 13:14:07

          Merci pour vos deux réponses ! Celle de stackOverflow me correspond mieux merci bien, mais par curiosité quel est l'effet du "break" ? Juste sortir de la boucle c'est ça ?
          • Partager sur Facebook
          • Partager sur Twitter
          "The best thing about now, is that there's another one tomorrow."
            4 mars 2013 à 13:16:41

            Exactement. Le break permet de sortir de la boucle si l'input entre par l'utilisateur est correct.
            • Partager sur Facebook
            • Partager sur Twitter
              4 mars 2013 à 13:31:28

              shashimee a écrit:

              Celle de stackOverflow me correspond mieux merci bien

              Loin de moi l'idée de dénigrer la solution de stackOverflow, mais ma solution me semble plus évolutive. Si tu as un entier entre 1 et 100 au lieu d'entre 1 et 2, range(1, 100) est clairement plus rapide à écrire (et à exécuter puisqu'il s'agit d'un itérateur).

              • Partager sur Facebook
              • Partager sur Twitter
              Envie de mettre les mains dans le cambouis ? Passez à Funtoo GNU/Linux. DO IT!
                4 mars 2013 à 13:59:26

                A ce moment la, il suffit de remplacer le ['1', '2'] l.3 par map(str, range(1, 101)).

                PS: Dans la solution que tu proposes, il y a une erreur: c'est range(1, 3), et non range(1, 2). Sinon le cas ou choice = 2 est considere comme faux.

                -
                Edité par stackOverflow 4 mars 2013 à 14:11:03

                • Partager sur Facebook
                • Partager sur Twitter
                  4 mars 2013 à 15:39:26

                  Perso, c'est un peu plus compliqué, mais je m'y prendrais plutôt comme ça :

                  def salut():
                  
                  print('Salut !')
                  

                  def bonjour():

                  print('Bonjour !')
                  

                  actions = {

                  '1': salut,
                  '2': bonjour}
                  

                  while True:

                  choix = input('Votre choix ({}): '.format('|'.join(sorted(actions.keys()))))
                  if choix in actions:
                      actions[choix]()
                      break
                  else:
                      print("Ce choix n'est pas valable")
                  
                  </pre>
                  Votre choix (1|2): plop
                  Ce choix n'est pas valable
                  Votre choix (1|2): 3
                  Ce choix n'est pas valable
                  Votre choix (1|2): 1
                  Salut !
                  

                  Ça a le mérite de simplifier l'ajout de nouvelles fonctionnalités : il suffit de créer la fonction et de l'ajouter dans le dictionnaire actions.

                  -
                  Edité par nohar 4 mars 2013 à 15:40:23

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Zeste de Savoir, le site qui en a dans le citron !
                    4 mars 2013 à 15:43:18

                    Effectivement, très élégant d'ailleurs.

                    • Partager sur Facebook
                    • Partager sur Twitter
                    Envie de mettre les mains dans le cambouis ? Passez à Funtoo GNU/Linux. DO IT!
                      4 mars 2013 à 16:00:53

                      En fait, s'il s'agit de faire ce genre de menu, il y a moyen d'aller encore plus loin en le générant automatiquement (oui j'avais quelques minutes à perdre) :

                      def salut():
                          """Dire 'Salut !'."""
                          print('Salut !')
                      
                      def bonjour():
                          """Dire 'Bonjour !'."""
                          print('Bonjour !')
                      
                      def quitter():
                          """Quitter le programme."""
                          print('Au revoir !')
                          raise SystemExit
                      
                      def menu():
                          """Afficher le menu."""
                          for choix  in possibilites:
                              print('{0}:\t{1}'.format(choix, actions[choix].__doc__))
                          print()
                      
                      actions = {
                          '1': salut,
                          '2': bonjour,
                          '3': menu,
                          '4': quitter}
                      
                      possibilites = sorted(actions.keys())
                      
                      # Afficher le menu une première fois
                      print('MENU:')
                      menu()
                      
                      while True:
                          choix = input('Votre choix ({}): '.format('|'.join(possibilites)))
                          try: # plus pythonique qu'un 'if' dans ce cas
                              actions[choix]()
                          except KeyError: 
                              # /!\ Attention, je précise bien 'KeyError' !
                              # C'est l'exception qui est levée si le choix n'est pas dans le dictionnaire.
                              # Si je mettais juste 'except:', on ne pourrait pas quitter le programme.
                              print("Ce choix n'est pas valable")
                      
                      
                      MENU:
                      1:      Dire 'Salut !'.
                      2:      Dire 'Bonjour !'.
                      3:      Afficher le menu.
                      4:      Quitter le programme.
                      
                      Votre choix (1|2|3|4): plop
                      Ce choix n'est pas valable
                      Votre choix (1|2|3|4): 1
                      Salut !
                      Votre choix (1|2|3|4): 2
                      Bonjour !
                      Votre choix (1|2|3|4): 3
                      1:      Dire 'Salut !'.
                      2:      Dire 'Bonjour !'.
                      3:      Afficher le menu.
                      4:      Quitter le programme.
                      
                      Votre choix (1|2|3|4): 4
                      Au revoir !
                      

                      -
                      Edité par nohar 4 mars 2013 à 16:21:42

                      • Partager sur Facebook
                      • Partager sur Twitter
                      Zeste de Savoir, le site qui en a dans le citron !
                        4 mars 2013 à 20:43:31

                        Effectivement, très pratique et à peu près de mon niveau ! Merci bien nohar :) (Arnaud en verlan ?) ! Je retiens.
                        • Partager sur Facebook
                        • Partager sur Twitter
                        "The best thing about now, is that there's another one tomorrow."
                          4 mars 2013 à 20:46:35

                          Perso je n'aime pas trop l'utilisation de variables globales. Mais bon c'est vrai que là il n'y a pas trop le choix pour faire ça propre.

                          • Partager sur Facebook
                          • Partager sur Twitter
                          Envie de mettre les mains dans le cambouis ? Passez à Funtoo GNU/Linux. DO IT!
                            4 mars 2013 à 20:52:36

                            PyTony a écrit:

                            Perso je n'aime pas trop l'utilisation de variables globales.

                            Elles ne sont pas globales : il s'agit de variables de module, qui ne se trouvent pas dans le scope global du programme, mais dans celui du module auquel elles appartiennent.

                            La différence est de taille : elles ont tous les avantages des variables globales (en gros, se simplifier la vie) sans en avoir les inconvénients (name clashes etc.). ;)

                            Pour bien faire et coller à la PEP-8, par contre, j'aurais dû les nommer ACTIONS et POSSIBILITES tout en majuscule. Mais vu que le code n'est déjà pas en anglais, je pense qu'on n'est plus à ça près.

                            -
                            Edité par nohar 4 mars 2013 à 20:56:29

                            • Partager sur Facebook
                            • Partager sur Twitter
                            Zeste de Savoir, le site qui en a dans le citron !
                              4 mars 2013 à 21:01:19

                              Mais de quoi vous parlez, quand vous parlez de variables globales? Si vous voulez parler de possibilites dans la fonction menu, il suffit de lui passer possibilites en arguments, non?

                              Je suis pas sur de comprendre l'enjeu.

                              PS:

                              shashimee a écrit:

                              Merci bien nohar :) (Arnaud en verlan ?) !

                              nohar c'est aussi "jeunesse" en hebreu. Ce pseudo regorge de subtilites, et de secrets encore inconnus!

                              -
                              Edité par stackOverflow 4 mars 2013 à 21:10:16

                              • Partager sur Facebook
                              • Partager sur Twitter
                                4 mars 2013 à 21:07:01

                                Il n'empêche que dans certains cas ça peut foirer (si possibilites était un itérateur par exemple on ne pourrait afficher qu'une seule fois le menu). Là ça va c'est une petite fonction, mais sur des grosses fonctions on peut ne plus se rappeler que la variable n'est pas locale à la fonction et la modifier par inadvertance. D'une manière générale, je trouve ça aussi moins lisible, dans un gros script il peut être difficile de retrouver où a été défini/modifié la variable.

                                nohar a écrit:

                                Pour bien faire et coller à la PEP-8, par contre, j'aurais dû les nommer ACTIONS et POSSIBILITES tout en majuscule. Mais vu que le code n'est déjà pas en anglais, je pense qu'on n'est plus à ça près.

                                Certes

                                stackOverflow a écrit:

                                Mais de quoi vous parlez, quand vous parlez de variables globales? Si vous voulez parler de possibilites dans la fonction menu, il suffit de lui passer possibilites en arguments, non?

                                C'est pas si simple, ce sont des fonctions de callback là.

                                -
                                Edité par PyTony 4 mars 2013 à 21:09:51

                                • Partager sur Facebook
                                • Partager sur Twitter
                                Envie de mettre les mains dans le cambouis ? Passez à Funtoo GNU/Linux. DO IT!
                                  4 mars 2013 à 21:11:12

                                  PyTony a écrit:

                                  dans un gros script il peut être difficile de retrouver où a été défini/modifié la variable.

                                  En fait la PEP-8 est bien faite : si ta variable est tout en majuscules, c'est que c'est une variable de module, donc ça limite les modifications par erreur. Ensuite pour retrouver sa définition, tous les bons éditeurs permettent un truc de ce genre. Par exemple dans Vim, dans le mode normal, il suffit de se positionner sur le nom de variable et d'appuyer sur * pour rechercher ses occurences dans le fichier courant.

                                  Quoi qu'il en soit je suis quand même d'accord avec toi. Les variables de module simplifient la vie dans les petits scripts qu'on hacke en 2 minutes, et elles évitent de se prendre la tête, mais ce n'est pas non plus un way of life.

                                  -
                                  Edité par nohar 4 mars 2013 à 21:13:46

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                  Zeste de Savoir, le site qui en a dans le citron !
                                    4 mars 2013 à 21:15:14

                                    PyTony a écrit:

                                    stackOverflow a écrit:

                                    Mais de quoi vous parlez, quand vous parlez de variables globales? Si vous voulez parler de possibilites dans la fonction menu, il suffit de lui passer possibilites en arguments, non?

                                    C'est pas si simple, ce sont des fonctions de callback là.

                                    Tu peux developper? J'ai bien trouve ca, mais je vois pas trop le rapport avec l'exemple de nohar.

                                    Quelles sont les alternatives aux variables de modules dans notre cas?

                                    -
                                    Edité par stackOverflow 4 mars 2013 à 21:17:20

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      4 mars 2013 à 21:20:06

                                      Ah non pardon ce ne sont pas vraiment des callbacks, j'avais la tête ailleurs. Donc oui on peut passer actions et possibilites en paramètres. Ça me semble plus propre d'ailleurs.

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                      Envie de mettre les mains dans le cambouis ? Passez à Funtoo GNU/Linux. DO IT!
                                      Anonyme
                                        4 mars 2013 à 21:32:20

                                        Ici, actions et possibilites (s'il elle avaient été déclaré en majuscule) pourrait plutôt être assimilé à des constantes, puisqu'elles ne sont modifiées nulle part.

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          4 mars 2013 à 21:38:18

                                          PyTony a écrit:

                                          Ah non pardon ce ne sont pas vraiment des callbacks, j'avais la tête ailleurs. Donc oui on peut passer actions et possibilites en paramètres. Ça me semble plus propre d'ailleurs.

                                          On peut, mais ça oblige de passer un dictionnaire et une liste à tout un tas de fonctions qui n'en ont pas besoin (alors qu'une seule a besoin d'elles), donc c'est bancal.

                                          Ce qui peut se faire, aussi, c'est un bind grâce à une lambda (la magie de l'évaluation différée !) :

                                          def salut():
                                          
                                          """Dire 'Salut !'."""
                                          print('Salut !')
                                          

                                          def bonjour():

                                          """Dire 'Bonjour !'."""
                                          print('Bonjour !')
                                          

                                          def quitter():

                                          """Quitter le programme."""
                                          print('Au revoir !')
                                          raise SystemExit
                                          

                                          def menu(actions):

                                          """Afficher le menu."""
                                          items = sorted(actions.keys())
                                          for choix in items:
                                              print('{0}:\t{1}'.format(choix, actions[choix].__doc__))
                                          print()
                                          

                                          ACTIONS = {

                                          '1': salut,
                                          '2': bonjour,
                                          '3': lambda: menu(ACTIONS),
                                          '4': quitter}
                                          

                                          Afficher le menu une première fois

                                          print('MENU:') menu(ACTIONS) while True:

                                          choix = input('Votre choix ({}): '.format('|'.join(sorted(ACTIONS.keys()))))
                                          try:
                                              ACTIONS[choix]()
                                          except KeyError:
                                              print("Ce choix n'est pas valable")
                                          
                                          </pre>

                                          Notez que j'avais défini POSSIBILITES à part simplement parce que j'aimais pas l'idée de ré-évaluer et re-trier les clés à chaque fois qu'on en a besoin, m'enfin dans le cas d'un menu on s'en cogne un peu des considérations sur les performances...

                                          -
                                          Edité par nohar 4 mars 2013 à 21:42:56

                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                          Zeste de Savoir, le site qui en a dans le citron !
                                            5 mars 2013 à 0:29:03

                                            Encore merci pour cette aide qui m'a été précieuse, c'est exactement le genre de réponse que je cherchais, je l'ai d'ailleurs intégré à mon programme (un petit jeu sympa) :) Et oui nohar m'inspire beaucoup comme pseudo haha, on pourrait trouver de nombreuses significations ... des réponses de la part de l'interessé ? 

                                            Une autre question à la va-vite, m'évitant de créer un nouveau topic :

                                            J'ai enregistrer une fonction dans un fichier avec mon amis "pickle" de cette manière :

                                            import pickle
                                            import time
                                            def scenario():
                                                print("Oh mon dieu mais c'est ...")
                                                time.sleep(2)
                                                print("UN OUUUURS !")
                                            with open("Testi.txt","wb") as fichier:
                                                a = pickle.Pickler(fichier)
                                                a.dump(scenario())
                                            

                                            Mais je ne sais absolument pas comment la récuperer car si je fais :

                                            import pickle
                                            
                                            with open("Testi.txt","rb") as fichier:
                                                a = pickle.Unpickler(fichier)
                                                scenario = a.load()
                                            
                                            scenario()
                                            

                                            Cela ne marche pas bien évidemment car le "scenario" n'est plus une fonction ... Mais alors comment faire ? La redéfinir dans une autre fonction ? J'essaie depuis 30 minutes mais je cale ... Une solution facile ?


                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                            "The best thing about now, is that there's another one tomorrow."
                                              5 mars 2013 à 0:49:33

                                              shashimee a écrit:

                                              Encore merci pour cette aide qui m'a été précieuse, c'est exactement le genre de réponse que je cherchais, je l'ai d'ailleurs intégré à mon programme (un petit jeu sympa) :) Et oui nohar m'inspire beaucoup comme pseudo haha, on pourrait trouver de nombreuses significations ... des réponses de la part de l'interessé ? 

                                              Je pense que la réponse se trouve juste à la première ligne sous son pseudo sur sa page de profile.

                                              shashimee a écrit:

                                              Une autre question à la va-vite, m'évitant de créer un nouveau topic :

                                              J'ai enregistrer une fonction dans un fichier avec mon amis "pickle" de cette manière :

                                              import pickle
                                              import time
                                              def scenario():
                                                  print("Oh mon dieu mais c'est ...")
                                                  time.sleep(2)
                                                  print("UN OUUUURS !")
                                              with open("Testi.txt","wb") as fichier:
                                                  a = pickle.Pickler(fichier)
                                                  a.dump(scenario())
                                              

                                              Mais je ne sais absolument pas comment la récuperer car si je fais :

                                              import pickle
                                              
                                              with open("Testi.txt","rb") as fichier:
                                                  a = pickle.Unpickler(fichier)
                                                  scenario = a.load()
                                              
                                              scenario()
                                              

                                              Cela ne marche pas bien évidemment car le "scenario" n'est plus une fonction ... Mais alors comment faire ? La redéfinir dans une autre fonction ? J'essaie depuis 30 minutes mais je cale ... Une solution facile ?


                                              Je pense que tu devrais plutôt ouvrir un nouveau sujet. Cette question n'ayant aucun lien avec la première.

                                              -
                                              Edité par PyTony 5 mars 2013 à 0:51:22

                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                              Envie de mettre les mains dans le cambouis ? Passez à Funtoo GNU/Linux. DO IT!
                                                5 mars 2013 à 0:50:17

                                                essayes ligne 9:

                                                a.dump(scenario)

                                                • Partager sur Facebook
                                                • Partager sur Twitter

                                                Python c'est bon, mangez-en. 

                                                  6 mars 2013 à 0:57:03

                                                  "Je pense que tu devrais plutôt ouvrir un nouveau sujet. Cette question n'ayant aucun lien avec la première."

                                                  Ok c'est ce que je vais faire !

                                                  Sinon josmiley, j'ai essayer et non, en vain. Merci quand même !

                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                  "The best thing about now, is that there's another one tomorrow."
                                                    6 mars 2013 à 8:43:59

                                                    2 jours plus tard ... :)

                                                    Je te propose une autre solution (tu en auras pour tout les goût) :

                                                    class Input:
                                                    	def __init__ (self, generator = input):
                                                    		"""Use 'generator' as input"""
                                                    		self.generator = generator
                                                    	
                                                    	def __next__ (self):
                                                    		"""Forth and give 'item'"""
                                                    		self.forth ()
                                                    		return self.item
                                                    	
                                                    	def forth (self):
                                                    		"""Ask a new item"""
                                                    		self.item = self.generator ()
                                                    	
                                                    	def satisfy (self, pred):
                                                    		"""Ask an item checking 'pred'"""
                                                    		self.forth ()
                                                    		if (not pred (self.item)):
                                                    			self.satisfy (f)
                                                    i = lambda: input ("1 or 2? ")
                                                    f = lambda x: int (x) in range (1, 2)
                                                    
                                                    a = Input (i)
                                                    a.satisfy (f)
                                                    
                                                    if a.item == '1':
                                                    	print ("it is 1")
                                                    else:
                                                    	print ("it is 2")



                                                    -
                                                    Edité par Conaclos 6 mars 2013 à 8:44:41

                                                    • Partager sur Facebook
                                                    • Partager sur Twitter

                                                    Choix restreint ?

                                                    × 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