Partage
  • Partager sur Facebook
  • Partager sur Twitter

Programme de mot de passe

Sujet résolu
    4 décembre 2015 à 20:08:28

    Bonjour, je suis actuellement entrain de faire un programme qui va demender a l'utilisateur de rentrer un mot de passe qui doit avoir entre 5 et 10 caractère et minimum 2 chiffre.

    J'arrive a peut près a tout faire le seul problème s'est que je ne sait pas comment faire pour vérifier dans mon code si il y a minimum 2 chiffre, merci d'avance pour votre aide.

    • Partager sur Facebook
    • Partager sur Twitter
      4 décembre 2015 à 21:16:52

      Sais tu ce que sont les regex?

      Si oui, les utilise tu ?

      • Partager sur Facebook
      • Partager sur Twitter
      Créateur de mauvaises blagues et de mauvais jeux depuis 1999 - Endless-caves - Endless-rooms
      Anonyme
        4 décembre 2015 à 21:27:49

        algorithmiquement c'est quand même très simple, qu'as-tu essayé ?

        • Partager sur Facebook
        • Partager sur Twitter
          5 décembre 2015 à 7:27:31

          Non je ne sait pas se que sont les regex.

          Pour le moment pas grand chose je ne voit vraiment pas comment faire...

          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            5 décembre 2015 à 9:18:41

            Ok, essayes de comprendre ce programme

            def check(s):
                
                s = s.lower() # permet de transformer pour le test les majuscules en minuscules
                
                counter_char = 0 # compteur de caractères
                counter_digit = 0 # compteur de chiffres
                
                for char in s:
                    if char in ('0123456789'):
                        counter_digit += 1
                    counter_char += 1
                
                test_1 = counter_digit >= 2
                test_2 = counter_char >= 5 and counter_char <= 10
                
                return test_1 and test_2



            • Partager sur Facebook
            • Partager sur Twitter
              5 décembre 2015 à 16:29:53

              je dirais que pour compter les caractères un bon len(s) est suffisant mais sinon j'approuve
              • Partager sur Facebook
              • Partager sur Twitter
              Touche a tout, nul en tout
              Anonyme
                5 décembre 2015 à 17:48:21

                @Kaygu,

                Le fait de faire un len(s) fera que tu parcoures deux fois la chaîne de caractères, car tu devras dans tout les cas compter le nombre d'entiers dans cette chaîne.

                • Partager sur Facebook
                • Partager sur Twitter
                  5 décembre 2015 à 18:01:34

                  oldProgrammer a écrit:

                  Le fait de faire un len(s) fera que tu parcoures deux fois la chaîne de caractères, car tu devras dans tout les cas compter le nombre d'entiers dans cette chaîne.

                  Il ne me semble pas que len parcoure la chaîne pour en calculer la taille. Celle-ci doit-être calculer à la création de l'objet (qui de plus n'est pas mutable), et donc un appel à len ne coûte rien, en plus d'être plus propre.

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Anonyme
                    6 décembre 2015 à 9:17:13

                    @entwanne,

                    Effectivement, bien vu... Je simplifie le code en conséquence pour rendre le code plus logique

                    def check(s):
                         
                        s = s.lower() # permet de transformer pour le test les majuscules en minuscules
                         
                        counter_digit = 0 # compteur de chiffres
                         
                        for char in s:
                            if char in ('0123456789'):
                                counter_digit += 1
                         
                        test_1 = counter_digit >= 2
                        test_2 = len(s) >= 5 and len(s) <= 10
                         
                        return test_1 and test_2

                    Pour confirmation, et pour les curieux, voici l'implémentation intéressante

                    What happens when you assign a new string to a variable like this one?
                    1
                    	>>> s1 = 'abc'
                    
                    The internal C function “PyString_FromString” is called and the pseudo code looks like this:
                    	arguments: string object: 'abc'
                    	returns: Python string object with ob_sval = 'abc'
                    	PyString_FromString(string):
                    	    size = length of string
                    	    allocate string object + size for 'abc'. ob_sval will be of size: size + 1
                    	    copy string to ob_sval
                    	    return object
                    Each time a new string is used, a new string object is allocated.




                    • Partager sur Facebook
                    • Partager sur Twitter
                      6 décembre 2015 à 11:43:33

                      Sinon, je ne comprends pas bien pourquoi utiliser lower, et je proposerais plutôt ceci :

                      from string import digits
                      
                      def check(s):
                          return 5 <= len(s) <= 10 and sum(1 for c in s if c in digits) >= 2
                      
                      • Partager sur Facebook
                      • Partager sur Twitter
                      Anonyme
                        6 décembre 2015 à 12:32:31

                        Dans le même genre, mais uniquement avec du built-in (et une petite lambda pour la route) :

                        check = lambda s: 5 <= len(s) <= 10 and sum(c.isdigit() for c in s) >= 2
                        
                        • Partager sur Facebook
                        • Partager sur Twitter
                          6 décembre 2015 à 12:37:36

                          Et une toute petite simplification

                          from string import digits
                           
                          def check(s):
                              return 5 <= len(s) <= 10 and sum(c in digits for c in s) >= 2
                          

                          Ça fonctionne car le résultat d'un test (c in digits) retourne un bool qui est en fait un entier 0 (False) ou 1 (True).

                          -
                          Edité par Dan737 6 décembre 2015 à 12:41:22

                          • Partager sur Facebook
                          • Partager sur Twitter
                            6 décembre 2015 à 13:04:27

                            Oui, ça fonctionne, mais ça reste un comportement pas toujours clair dû au fait que bool hérite d'int, je préférais rendre ça explicite. Mais c'est effectivement mieux avec le isdigit que j'avais oublié.

                            -
                            Edité par entwanne 6 décembre 2015 à 13:04:49

                            • Partager sur Facebook
                            • Partager sur Twitter
                            Anonyme
                              6 décembre 2015 à 18:19:48

                              Les codes suivants sont plus en rapport avec la force python, alors que le PO recherche peut-être quelque chose de plus algorithmique. Alors l'utilisation de len ok, ils ont du voir cela comme base dans leur cours, mais sum, je ne pense pas...

                              • Partager sur Facebook
                              • Partager sur Twitter

                              Programme de mot de passe

                              × 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