Annonce

Réduire
Aucune annonce.

Besoin d'aide sur le loop d'une fonction Python

Réduire
X
 
  • Filtre
  • Heure
  • Afficher
Tout nettoyer
nouveaux messages

  • Besoin d'aide sur le loop d'une fonction Python

    Salut à tous ! J'aurais besoin que m'a fonction soit exécutée en boucle, afin qu'on ait plus qu'à entrer un nouveau nombre pour que tout se refasse. C'est pour ca que je défini ma fonction, je lui dit d'utiliser les variables globales qui sont définies juste après, et ensuite de faire les opérations nécessaires. Un fois que ca c'est fait, le nombre B devient le nombre A, et j'ai besoin donc d'un nouveau nombre B, d'où le input à la fin. Après ce dernier input, j'aurais donc besoin de recommencer tout le tintouin, mais je n'y arrive pas.

    pourriez-vous me filer un petit coup de main ? C'est la première fois que j'écris en python, alors n'hésitez pas à me dire tout ce qui ne va pas !

    Code:
    #! /usr/bin/python
    def myFunc():
      global A
      global B
      C=A-B  
      if C > 26:
        C=C%26
        A=B
        
      if C == 1:
       print ("A")
      elif C == 2:
       print ("B")
      elif C == 3:
       print ("C")
      elif C == 4:
        print ("D")
      elif C == 5:
       print ("E")
      elif C == 6:
       print ("F")
      elif C == 7:
       print ("G")
      elif C == 8:
       print ("H")
      elif C == 9:
       print ("I")
      elif C == 10:
       print ("J")
      elif C == 11:
       print ("K")
      elif C == 12:
       print ("L")
      elif C == 13:
       print ("M")
      elif C == 14:
       print ("N")
      elif C == 15:
       print ("O")
      elif C == 16:
       print ("P")
      elif C == 17:
       print ("Q")
      elif C == 18:
       print ("R")
      elif C == 19:
       print ("S")
      elif C == 20:
       print ("T")
      elif C == 21:
       print ("U")
      elif C == 22:
       print ("V")
      elif C == 23:
       print ("W")
      elif C == 24:
       print ("X")
      elif C == 25:
       print ("Y")
      elif C == 26:
       print ("Z")
      B=input("Enter the next number\n")
      
      
    
    
    A=input("Enter the first number\n")
    B=input("Enter the second number\n")
    
    
    while True:
      myFunc()
    Dans l'état actuel des choses, tout marche très bien, j'obtiens les bon résultats et tout. Mais une fois arrivé à "Enter the next number", le script bloque dessus en boucle et demande sans arrêt le nombre suivant, sans rien en faire.
    Dernière modification par comaX, 18 janvier 2013, 14h07.

  • #2
    En fait je m'en suis sorti en passant les variables A et B en paramètres de la fonction.

    Le code ressemble donc maintenant à ca :

    La prochaine étape est de lire le nombre suivant depuis un fichier texte, et je n'ai pas encore la moindre idée de comment faire, donc toute piste de réflexion est la bienvenue.

    Code:
    #! /usr/bin/python
    A=input("Enter the first number\n")
    B=input("Enter the second number\n")
    
    
    def myFunc(A, B):
      C=A-B  
      if C > 26:
        C=C%26
              
      if C == 1:
       print ("A")
      elif C == 2:
       print ("B")
      elif C == 3:
       print ("C")
      elif C == 4:
        print ("D")
      elif C == 5:
       print ("E")
      elif C == 6:
       print ("F")
      elif C == 7:
       print ("G")
      elif C == 8:
       print ("H")
      elif C == 9:
       print ("I")
      elif C == 10:
       print ("J")
      elif C == 11:
       print ("K")
      elif C == 12:
       print ("L")
      elif C == 13:
       print ("M")
      elif C == 14:
       print ("N")
      elif C == 15:
       print ("O")
      elif C == 16:
       print ("P")
      elif C == 17:
       print ("Q")
      elif C == 18:
       print ("R")
      elif C == 19:
       print ("S")
      elif C == 20:
       print ("T")
      elif C == 21:
       print ("U")
      elif C == 22:
       print ("V")
      elif C == 23:
       print ("W")
      elif C == 24:
       print ("X")
      elif C == 25:
       print ("Y")
      elif C == 26:
       print ("Z")
    myFunc(A, B)
    
    
    while True:
      NombreSuivant=input("Enter the next number\n")
      B=A
      A=NombreSuivant
      myFunc(A, B)
    Dernière modification par comaX, 12 décembre 2011, 22h30.

    Commentaire


    • #3
      Tiens, ta fonction sera plus simple comme ceci :

      Code:
      def myFunc(A, B):
      	C=A-B  
      	if C > 26:
      		C=C%26
          
      	array_A = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26]
      	array_B = ["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"]
      
      
      
      
      	for i in range(len(array_A)):
      		if C == array_A[i]:
      			print array_B[i]
      		else:
      			continue

      Sinon pour ce qui est de la lecture de fichier texte , ce lien devrait t'aider : http://fr.wikibooks.org/wiki/Apprend...n/Les_fichiers

      Commentaire


      • #4
        En effet c'est plus joli ! Je vais me pencher sur ces arrays, ça m'a l'air bien pratique !

        Merci pour le lien

        Commentaire


        • #5
          Si je peux me permettre une proposition de modification de votre code

          Code:
          from string import ascii_uppercase
          def myFunc(A, B):
              C=A-B  
              if C > 26:
                  C=C%26
              
              array_A = range(1, 27)
              array_B = list(ascii_uppercase)
          
              for i, _ in enumerate(array_A):
                  if C == array_A[i]:
                      print array_B[i]
          Non testé

          En fait je suis sûr qu'on peut faire plus simple si je savais ce que veut exactement faire le PO.

          Le code suivant

          Code:
          from string import ascii_uppercase
          
          dico = {}
          
          for i, letter in enumerate(ascii_uppercase):
              dico[i+1] = letter
              
          print dico
          donne

          {1: 'A', 2: 'B', 3: 'C', 4: 'D', 5: 'E', 6: 'F', 7: 'G', 8: 'H', 9: 'I', 10: 'J', 11: 'K', 12: 'L', 13: 'M', 14: 'N', 15: 'O', 16: 'P', 17: 'Q', 18: 'R', 19: 'S', 20: 'T', 21: 'U', 22: 'V', 23: 'W', 24: 'X', 25: 'Y', 26: 'Z'}

          Ce qui permet de faire facilement la correspondance avec

          Code:
          print dico[ma_valeur] # donne la valeur correspondante
          Dernière modification par fred, 26 décembre 2011, 22h58.

          Commentaire


          • #6
            Si je peux me permettre une proposition de modification de votre code
            Mais je t'en prie, tu es même le bienvenue !

            Merci pour ces détails, j'en tiendrais compte en me repenchant là dessus.

            Pour la petite histoire, le but du script est de trouver la lettre correspondant à un nombre modulo 26, après soustraction de deux nombres consécutifs.

            J'imagine que la plupart avait compris, mais pour ce qui tomberait sur le sujet, autant le préciser !

            Commentaire


            • #7
              Pour la petite histoire, le but du script est de trouver la lettre correspondant à un nombre modulo 26
              J'imaginais bien que c'était quelquechose de ce genre

              Nous étions donc bien parti, et si je complète mon code avec le dico, voici ce que ça peut donner

              Code:
              from string import ascii_uppercase 
              
              def myFunc(n):
                  return dico[n]
              
              dico = {}  
              
              for i, letter in enumerate(ascii_uppercase):     
                  dico[i+1] = letter
              
              print dico[(int(raw_input("Nombre A : "))-int(raw_input("Nombre B : "))) % 26]
              En testant :

              Nombre A : 25
              Nombre B : 23
              B # resultat de
              Dernière modification par fred, 27 décembre 2011, 09h29.

              Commentaire


              • #8
                Nickel, mais il manque juste une chose, c'est le nombre suivant, pour éviter de retaper chaque nombre deux fois. Il faut donc que B deviennent A, et que A soit à nouveau lu.

                Ceci-dit, comme c'est un truc de crypto, la liste de nombre à décrypter pourraient être lue directement plutot que de l'entrer soit même. Pour faire ça, je sait qu'il faut l'ouvrir en mode lecture, facile, mais pour la suite... Limite s'il y avait un équivalent de awk en python, je saurais le faire, mais là, je suis dans le flou !

                Commentaire


                • #9
                  En fait le code que je t'ai donné te permet de l'adapter au tien

                  Nickel, mais il manque juste une chose, c'est le nombre suivant, pour éviter de retaper chaque nombre deux fois. Il faut donc que B deviennent A, et que A soit à nouveau lu.
                  Tu auras en effet besoin d'enregistrer dans une variable tes nombres.

                  Mais j'ai du mal à voir ce que tu recherches exactement, pourrais-tu me donner un algorithme?

                  Edit :

                  En vue de ce que tu as fais précédemment je me suis fais mes petites conclusions, et il se pourrait que ce code te convienne.

                  Si ce n'est pas le cas, l'algorithme reste d'actualité.

                  Code:
                  from string import ascii_uppercase 
                  
                  dico = {}  
                  
                  for i, letter in enumerate(ascii_uppercase):     
                      dico[i+1] = letter
                  
                  A = int(raw_input("Entrer la valeur de A :"))
                  B = int(raw_input("Entrer la valeur de B :"))
                  
                  while True:
                      C = (A-B) % 26
                      print dico[C]
                      B = A
                      A = int(raw_input("Entrer la valeur de A :"))
                  Dernière modification par fred, 27 décembre 2011, 14h02.

                  Commentaire


                  • #10
                    Je vais essayer ça !

                    J'osais pas trop en dire pour éviter de donner la solution, car il s'agit d'un challenge sur un site, où il y a toute une liste de nombres consécutifs à décoder avec cette méthode. Comme je ne voulais pas le faire à la main, je me suis dit : autant écrire un script. Donc, pour l'instant il est semi-automatique, mais maintenant, je vais chercher à comment lire les nombres sans intervention humaine.

                    Je reviendrais chercher de l'aide là-dessus si je galère.

                    Note : mon second script m'avait suffit à résoudre le challenge, donc n'ayez crainte, vous ne me machez pas le travail. En tout cas merci, pour les astuces et améliorations, parce qu'au final, il se pourrait bien qu'il se retrouve dans le projet de crypto/stégano !

                    Commentaire


                    • #11
                      Si je peux me permettre d’arriver après la bataille ( ), on peut faire encore plus simple et se passer totalement de dict, avec ord() et chr() (qui convertissent respectivement une lettre ASCII en nombre, et vice-versa). Comme ça (attention, code py3) :

                      Code:
                      A = int(input("Entrer la valeur de A :"))
                      B = int(input("Entrer la valeur de B :"))
                      off = ord('A')
                      
                      while True:
                          print(chr(((A-B) % 26) + off))
                          B = A
                          A = int(input("Entrer la valeur de A :"))
                      Au passage, faire dico[i+1] = letter est à mon avis une erreur, car cela génère des clés de 1 à 26, alors que (A-B) % 26 génère des nombres compris entre 0 et 25…

                      Commentaire


                      • #12
                        Envoyé par mont29 Voir le message
                        Au passage, faire dico[i+1] = letter est à mon avis une erreur, car cela génère des clés de 1 à 26, alors que (A-B) % 26 génère des nombres compris entre 0 et 25…
                        J'imagine que tu entends par là [0-25] non ? Alors qu'il faudrait [1-26], à moins que A=0, ce qui est possible, mais ce dont je doute !
                        Donc, des clés [1-26], qui donnent la bonne lettre, ca va très bien non ?

                        Commentaire


                        • #13
                          Envoyé par comaX Voir le message
                          J'imagine que tu entends par là [0-25] non ? Alors qu'il faudrait [1-26], à moins que A=0, ce qui est possible, mais ce dont je doute !
                          Donc, des clés [1-26], qui donnent la bonne lettre, ca va très bien non ?
                          Normalement, ca devrait être [0..25] Mais vu que dans le fred que vous semblez appréciez il y a ce : dico[i+1] elles sont donc bien [1..26]

                          Commentaire


                          • #14
                            Bah désolé, mais en gros, dans le dico de fred, on a {1:A, 2:B, 3:C, etc.}. Puis, dico[(A-B)%26]. Donc, pour A-B = 0, 26, 52, etc., la clé du dico vaut 0, qui n’existe pas. De même, Z (clé 26) ne sera jamais trouvé, vusque puisque (A-B)%26 ne peut prendre que des valeurs [0 … 25] ! Donc, soit faut réduire de 1 les clés du dico (le plus simple), soit faut utiliser (A-B)%26+1 comme clé.

                            Mais encore une fois, il est nettement plus simple ici d’utiliser ord()/chr(), amha…

                            Commentaire


                            • #15
                              Au passage, faire dico[i+1] = letter est à mon avis une erreur, car cela génère des clés de 1 à 26, alors que (A-B) % 26 génère des nombres compris entre 0 et 25…
                              Oui j'ai simplement voulu suivre l'idée de comaX et son 1er post et donc commencer à 1 jusqu'à 26, sinon il est vrai que commencer à 0 jusqu'à 25 est plus logique.

                              Mais mont29 a raison, chr et ord sont plus efficaces je pense...

                              Commentaire

                              Chargement...
                              X