Partage
  • Partager sur Facebook
  • Partager sur Twitter

quelques questions de debutants

Sujet résolu
    15 décembre 2010 à 10:54:59

    bonjour a tous bon alors voila je me sis fait un petit programme tout simple qui consiste a entrer une chaine de caractères et ça l'a ressort avec les lettres à l'envers c'est vraiment basique je sais :p mais j'ai quelques questions quant à optimisations et la finalisation :)
    voila mon code "améliorer" desolé il est un peu long ^^
    import os
    
    def flip():
    	print("entrer chaine")
    	chaine=input()
    	for lettre in chaine:
                    d= {
                            "a":"ɐ",
                            "b":"b",
                            "c":"ɔ",
                            "d":"p",
                            "e":"ǝ",
                            "f":"ɟ",
                            "g":"ƃ",
                            "h":"ɥ",
                            "i":"ı",
                            "j":"ɾ",
                            "k":"ʞ",
                            "l":"l",
                            "m":"ɯ",
                            "n":"u",
                            "o":"o",
                            "p":"d",
                            "q":"b",
                            "s":"s",
                            "t":"ʇ",
                            "u":"n",
                            "v":"ʌ",
                            "w":"ʍ",
                            "x":"x",
                            "y":"ʎ",
                            "z":"z",
                            }
                    print ("".join( d.get(c,c) for x in input() )
    

    mais ça me sort une erreur de syntaxe que je ne connais vu que je ne connais aps cette phrase
    print ("".join( d.get(c,c) for x in input() )
    



    I)personnellement j'utilise IDLE que je trouve bien
    donc je le lance pas de problèmes mais voila je voudrais le lancer dans une console DOS seulement lorsque je double clic sur mon flip.py la fenêtre s'ouvre et se referme en 0.00000001 sec :lol:
    alors?

    II)comment le compiler en.exe
    de manière a ne pas avoir a entrer flip() a chaque fois


    voila merci en tout cas désolé si j'ai loupé quelques trucs du cours je ne l'ai pas fini merci :)
    • Partager sur Facebook
    • Partager sur Twitter
      15 décembre 2010 à 11:36:24

      Ton gros tas de if peut s'exprimer de façon beaucoup plus simple (et efficace) avec un dict :

      d = {
         "a": "ɐ",
         "b": "q",
      etc
      
      }
      
      print "".join( d.get(c,c) for x in input() )
      


      Pour éviter que la fenêtre DOS de ferme à la fin, rajoute un raw_input("appuie sur entrée") à la fin de ton code python.
      • Partager sur Facebook
      • Partager sur Twitter
        15 décembre 2010 à 11:37:37

        salut merci
        en effet je cherchais un équivalent du cond en scheme merci je vais tester tout ça :)
        merci
        bon par contre je ne comprends pas la dernière ligne
        print "".join( d.get(c,c) for x in input() )
        

        merci de me l'expliquer
        j'ai bien appelé le dictionnaire d mais on peut lui donner le nom qu'on veut non?
        et ensuite le for x in input ()le x doit être x ou lettre?
        et à quoi correspond le d.get(c,c)? je comprends le d.get mais pas le (c,c)
        merci de ton aide et désolé pour ma noobitude :D
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          15 décembre 2010 à 12:13:24

          Salut,

          Peux-tu nous dire quelle version de python tu utilise (2 ou 3) ?

          Par rapport à tes première question :

          Tu peux commencer par virer ton os.system() qui n'est pas à utiliser de toute façon et le remplacer par raw_input() (Python 2.x) ou input() (Python 3.x).
          Pour que ta fonction soit exécutée lorsque tu double-clic sur le fichier ou que tu lance ton script en console il faut le faire dans le script :
          def f():
              print("Salutation !")
          
          if __name__ == "__main__":
              f()
              input('Appuyez sur "entrée"...')
          


          __name__ contient le nom du module ou "__main__" si il s'agit du module principal de ton programme (celui que tu exécute).

          Pour la seconde :
          d.get(c, c) te retourne soit la valeur correspondante à la clés d[c] soit c si il n'y a pas de clés d[c] . (dans l'exemple se serai plutot x)
          • Partager sur Facebook
          • Partager sur Twitter
            15 décembre 2010 à 12:44:18

            Quelques précisions sur le code de LCN.

            1) Tout d'abord c'est get(x,x) pas get(c,c), erreur de typo.

            2) L'intérêt d'utiliser get(x,x), c'est que du coup tu peux virer les les éléments b, o, s x, z de ton dictionnaire. En effet, comme cela a été précisé, d.get(x,x) retourne soit la valeur correspondant à la clé x, soit s'il n'y a pas de clé, la valeur x.

            Donc si tu fait d.get("b", "b"), comme "b" n'est pas dans le dictionnaire, il te retournera "b". Si tu fais d.get("d","d"), comme "d" est dans le dictionnaire, il te retournera d["d"], c'est à dire "p".

            @LCN: Très belle manip' ce d.get(x,x), je n'y aurais pas pensé :)
            • Partager sur Facebook
            • Partager sur Twitter
              15 décembre 2010 à 12:57:08


              Alors tu peux enlever le for puisqu'il est déjà dans le "".join( d.get(c,c) for c in input() ).
              L'erreur de syntaxe, c'est parce que j'avais mis une parenthèse en trop.

              Explication :

              ( d.get(c,c) for c in chaine )

              est un générateur qui retourne à la queue leu leu tous les d.get(c,c) pour tous les caractères de la chaine
              le fait de mettre d.get(c,c) et non d[c] évite une erreur si un caractère de la chaîne n'est pas trouvé dans d.

              "".join( liste )

              colle tous les morceaux de la liste dans une chaîne en intercalant "" entre chaque

              def flip( chaine ):
                              d= {
                                      "a":"ɐ",
                                      "b":"b",
                                      "c":"ɔ",
                                      "d":"p",
                                      "e":"ǝ",
                                      "f":"ɟ",
                                      "g":"ƃ",
                                      "h":"ɥ",
                                      "i":"ı",
                                      "j":"ɾ",
                                      "k":"ʞ",
                                      "l":"l",
                                      "m":"ɯ",
                                      "n":"u",
                                      "o":"o",
                                      "p":"d",
                                      "q":"b",
                                      "s":"s",
                                      "t":"ʇ",
                                      "u":"n",
                                      "v":"ʌ",
                                      "w":"ʍ",
                                      "x":"x",
                                      "y":"ʎ",
                                      "z":"z",
                                      }
                              return "".join( d.get(c,c) for c in chaine )
              

              • Partager sur Facebook
              • Partager sur Twitter
                15 décembre 2010 à 13:10:14

                oulalala
                ok bon alors deja merci pour vos réponses donc :
                @LeYan'tibus je suis en V3.1.3 sur win 32 voila
                donc je place ton code juste en dessous du def flip() mais est ce que je dois remplacer le main par flip?
                j'ai donc si j'ai bien suivi ceci?
                input() 
                def flip():
                        if __name__ == "__main__":
                    f()
                    input('Appuyez sur "entrée"...')
                
                	print("entrer chaine")
                	chaine=input()
                	for lettre in chaine:
                                d= {
                                        "a":"ɐ",
                                        "b":"b",
                                        "c":"ɔ",
                                        "d":"p",
                                        "e":"ǝ",
                                        "f":"ɟ",
                                        "g":"ƃ",
                                        "h":"ɥ",
                                        "i":"ı",
                                        "j":"ɾ",
                                        "k":"ʞ",
                                        "l":"l",
                                        "m":"ɯ",
                                        "n":"u",
                                        "o":"o",
                                        "p":"d",
                                        "q":"b",
                                        "s":"s",
                                        "t":"ʇ",
                                        "u":"n",
                                        "v":"ʌ",
                                        "w":"ʍ",
                                        "x":"x",
                                        "y":"ʎ",
                                        "z":"z",
                                        }
                                 return "".join( d.get(x,x) for c in chaine )
                

                et après?ça me sort une erreur à mon avis je pense que c'est un problème de connaissances notamment syntaxique plutôt que de compréhension. L'algo est simple en soi.
                donc bon si quelqu'un accepte de me donner sa source pour mon programme ce serait sympa car je patauge vraiment :euh:
                merci beaucoup en tout cas
                • Partager sur Facebook
                • Partager sur Twitter
                  15 décembre 2010 à 14:04:38

                  def flip(chaine):
                          d= { # Pas besoin de la double indentation, mais jai la flemme de l'enlever
                                          "a":"ɐ",
                                          "c":"ɔ",
                                          "d":"p",
                                          "e":"ǝ",
                                          "f":"ɟ",
                                          "g":"ƃ",
                                          "h":"ɥ",
                                          "i":"ı",
                                          "j":"ɾ",
                                          "k":"ʞ",
                                          "l":"l",
                                          "m":"ɯ",
                                          "n":"u",
                                          "p":"d",
                                          "q":"b",
                                          "t":"ʇ",
                                          "u":"n",
                                          "v":"ʌ",
                                          "w":"ʍ",
                                          "y":"ʎ"
                           }
                           return "".join( d.get(c,c) for c in chaine )
                  
                  if __name__ == "__main__":
                           chaine=input("entrer chaine")
                           flip(chaine)
                           input()
                  

                  cf les message plus haut pour les explications.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    15 décembre 2010 à 15:01:32

                    Pourquoi ne pas utiliser str.maketrans() ?
                    • Partager sur Facebook
                    • Partager sur Twitter
                      15 décembre 2010 à 15:18:12

                      Parce que ça ne gère pas l'unicode.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        15 décembre 2010 à 17:50:43

                        Citation : krocko


                        input() 
                        def flip():
                                if __name__ == "__main__":
                            f()
                            input('Appuyez sur "entrée"...')
                        




                        La programmation ça n'est pas de la magie ;) Il faut comprendre le sens des lignes que tu écris. Le programme s'exécute ligne par ligne, lorsque la fonction flip est exécutée il lit chaque ligne une par une et exécute donc le input('Apuyez sur "entrée"...') avant d'avoir vraiment exécuté ton algorithme. Tu n'as pas les bases en Python, tu devrais commencer par les acquérir avant d'aller plus loin.

                        Au passage, tu apprendras qu'on n'indente pas le code sans raison valable en Python (ce que tu fais dès la première ligne de flip).

                        Je ne comprends pas non plus pourquoi on t'a balancé une solution toute prête alors que tu n'es pas capable de la comprendre. C'est idiot.
                        • Partager sur Facebook
                        • Partager sur Twitter
                          15 décembre 2010 à 18:25:02

                          ce n'est pas idiot c'est un exemple
                          comme tu l'as dis je ne comprends pas tout et ce n'est pas de la magie dans tous les cours de toutes les matières tu trouveras des exemples
                          en effet je ne comprends pas certaines lignes et c'est pour ça que je demande :)
                          je ne pense pas que ce soit si dur que ça rassures toi j'ai deja fait de la programmation c'est par curiosité et pour le coté pratique de python que je m'y suis mis
                          • Partager sur Facebook
                          • Partager sur Twitter
                          Anonyme
                            15 décembre 2010 à 19:15:33

                            Pour mieux comprendre voilà un exemple que tu devrais enregistrer dans un fichier puis le tester une fois en l'important dans le shell python (IDLE si tu veux) et une autre en l'executant directement.

                            print("Texte 1 <-- Ce texte s'affiche à chaque importation ou",
                                  "execution du module.")
                            
                            if __name__ == "__main__":
                                print("Texte 2 <-- Ce texte s'affiche seulement lors de",
                                      "l'execution du module.")
                            


                            Ca c'est juste pour l'histoire du if __name__ == "__main__": . Après pour les problèmes d'indentation ce sont vraiment les bases de python; l'indentation est une obligation en python et elle doit respecter certaines règles.

                            Pour du reste, un bon tutoriel fera l'affaire. ;)
                            • Partager sur Facebook
                            • Partager sur Twitter
                              15 décembre 2010 à 19:25:09

                              salut
                              merci pour ton code mais j'ai vraiment du mal a saisir la fonction du if _name_ == "main" :(
                              que représente t'il même sur le tuto je n'ai pas très bien compris...
                              et même pas du tout :lol:
                              sinon sur Idle a me sort une erreur de syntaxe au niveau du print o_O
                              merci
                              • Partager sur Facebook
                              • Partager sur Twitter
                              Anonyme
                                15 décembre 2010 à 19:46:23

                                J'ai édité parce que je t'ai filé un truc qui n'expliquait pas très bien ce que je voulais que tu comprenne... :-°

                                Le but est simplement de se rendre compte qu'à la condition que __name__ soit égale à la chaine "__main__" alors les instructions ne s'execute que quand c'est le script qui est executé et pas importé.

                                Par contre pour l'erreur, chez moi y'en a pas, ni avec l'ancien exemple ni avec le nouveau... :(
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  15 décembre 2010 à 20:33:23

                                  Citation : krocko

                                  salut
                                  merci pour ton code mais j'ai vraiment du mal a saisir la fonction du if _name_ == "main" :(
                                  que représente t'il même sur le tuto je n'ai pas très bien compris...
                                  et même pas du tout :lol:
                                  sinon sur Idle a me sort une erreur de syntaxe au niveau du print o_O


                                  Si ça te perturbe, vire le, c'est pas indispensable. Par contre je te déconseille de laisser dans ton code des lignes que tu comprends pas, plus généralement quand on manipule des choses qu'on ne comprend pas trop, ça amène souvent des problèmes tôt ou tard (ici tu as de la chance, c'est tôt).
                                  • Partager sur Facebook
                                  • Partager sur Twitter

                                  Blond, bouclé, toujours le sourire aux lèvres...

                                    15 décembre 2010 à 21:41:52

                                    je suis tout a fait daccord avec toi et c'est d'ailleurs ce que jai fais mon programe est desormais fonctionnel je vous remercie tous
                                    certes simple mais concret ^^
                                    • Partager sur Facebook
                                    • Partager sur Twitter

                                    quelques questions de debutants

                                    × 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