Partage
  • Partager sur Facebook
  • Partager sur Twitter

Synthétisation/Optimisation de code avec lambda

Je souhaite comprendre comment optimiser mon code avec des lambdas

Sujet résolu
    30 mars 2020 à 15:51:23

    Bonjour, avec une équipe de 3, nous sommes en train de développer un jeu de Quarto sur python.

    On a créer 32 fonctions qui s'activent en cliquant sur les 16 boutons et les 16 cases, mais le code est plutôt... dégueulasse, si vous voyez ce que je veux dire ^^' enfin pas opti du tout, avec 16 fois la même fonction mais juste un numéro de variable qui change,

    je vous met un exemple :

    def case1():
        case1.place_forget()
        case1.configure(state="disabled")
        case2.configure(state="disabled")
        case3.configure(state="disabled")
        case4.configure(state="disabled")
        case5.configure(state="disabled")
        case6.configure(state="disabled")
        case7.configure(state="disabled")
        case8.configure(state="disabled")
        case9.configure(state="disabled")
        case10.configure(state="disabled")
        case11.configure(state="disabled")
        case12.configure(state="disabled")
        case13.configure(state="disabled")
        case14.configure(state="disabled")
        case15.configure(state="disabled")
        case16.configure(state="disabled")
        if (choix_piece==1) :
            piece1.place(x=160, y=75)
        if (choix_piece==2):
            piece2.place(x=160, y=75)
        if (choix_piece==3):
            piece3.place(x=160, y=75)
        if (choix_piece==4):
            piece4.place(x=160, y=75)
        if (choix_piece==5) :
            piece5.place(x=160, y=75)
        if (choix_piece==6):
            piece6.place(x=160, y=75)
        if (choix_piece==7):
            piece7.place(x=160, y=75)
        if (choix_piece==8):
            piece8.place(x=160, y=75)
        if (choix_piece==9) :
            piece9.place(x=160, y=75)
        if (choix_piece==10):
            piece10.place(x=160, y=75)
        if (choix_piece==11):
            piece11.place(x=160, y=75)
        if (choix_piece==12):
            piece12.place(x=160, y=75)
        if (choix_piece==13) :
            piece13.place(x=160, y=75)
        if (choix_piece==14):
            piece14.place(x=160, y=75)
        if (choix_piece==15):
            piece15.place(x=160, y=75)
        if (choix_piece==16):
            piece16.place(x=160, y=75)
        if (etat1==True):
            piece1.configure(state="normal")
        if (etat2==True):
            piece2.configure(state="normal")
        if (etat3==True):
            piece3.configure(state="normal")
        if (etat4==True):
            piece4.configure(state="normal")
        if (etat5==True):
            piece5.configure(state="normal")
        if (etat6==True):
            piece6.configure(state="normal")
        if (etat7==True):
            piece7.configure(state="normal")
        if (etat8==True):
            piece8.configure(state="normal")
        if (etat9==True):
            piece9.configure(state="normal")
        if (etat10==True):
            piece10.configure(state="normal")
        if (etat11==True):
            piece11.configure(state="normal")
        if (etat12==True):
            piece12.configure(state="normal")
        if (etat13==True):
            piece13.configure(state="normal")
        if (etat14==True):
            piece14.configure(state="normal")
        if (etat15==True):
            piece15.configure(state="normal")
        if (etat16==True):
            piece16.configure(state="normal")

    Ce que j'aimerais, c'est un moyen (avec les lambdas je crois mais j'ai pas réussi a trouver d'explications claires...) de compacter tout ça,

    par exemple avec une simple boucle for

    ex : for i in range (0,16)

          if (etat"i"==False):

            piece"i".configure(state="normal")

    Voilà, si vous pouvez m'aider je prends volontiers, merci d'avance.

    Bonne journée, Leogendra

    -
    Edité par Benzouye 30 mars 2020 à 18:43:46

    • Partager sur Facebook
    • Partager sur Twitter
      30 mars 2020 à 16:28:57

      Bonjour,

      Merci de créer un petit code fonctionnel représentant le problème, avec deux boutons par exemple.

      Il faut que de notre côté on puisse avoir un rendu et faire des tests.

      • Partager sur Facebook
      • Partager sur Twitter

      Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
      La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

        30 mars 2020 à 17:05:02

        Je comprends pas, pourtant dans ma question j'ai donné un exemple en particulier, y devrais pas y avoir besoin du code...

        -
        Edité par Leogendra 30 mars 2020 à 17:23:58

        • Partager sur Facebook
        • Partager sur Twitter
          30 mars 2020 à 17:09:10

          Tu ne réponds pas au besoin que j'exprime, et en plus sans le placer dans les balises code prévues pour que ton code soit lisible.

          Rien à comprendre dans le fait de créer un petit code testable et reproduisant le problème, si ? :euh:

          • Partager sur Facebook
          • Partager sur Twitter

          Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
          La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

            30 mars 2020 à 17:10:25

            Bonjour,

            Sinon, tu peux aussi utiliser les balises de codes pour mettre ... ton code. C'est le bouton  "</>"

            • Partager sur Facebook
            • Partager sur Twitter
            "Une vie ne vaut rien, mais rien ne vaut une vie", Malraux
              30 mars 2020 à 17:26:59

              Pardon je ne savais pas comment ajouter les balises, ceci dit, je comprends pas pourquoi il faut un code, pour simplifier, je voudrais compacter un truc comme ça :

              val1 = 10
              
              val2 = 10
              
              val3 = 10
              
              val4 = 10
              
              val5 = 10
              
              val6 = 10
              
              val7= 10

              pour que cela fasse quelque chose comme :

              for i in range (1,8)
                 var++i=10

              le deuxième code est FAUX, c'est pour cela que je cherche un moyen de le réaliser :)

              Merci


              • Partager sur Facebook
              • Partager sur Twitter
                30 mars 2020 à 17:37:20

                Bonjour, utilise un dictionnaire :
                val = {}
                for i in range(8):
                    val[i] = 10
                 for i in range(8):
                    print(val[i])
                • Partager sur Facebook
                • Partager sur Twitter
                • J'aime les bananes, le python, le gnu, le pingouin.
                  • Vive le libre !
                  30 mars 2020 à 17:48:50

                  Dictionnaire ou une simple liste si les indices partent de 0, c'est aussi simple.
                  • Partager sur Facebook
                  • Partager sur Twitter

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

                    30 mars 2020 à 18:38:19

                    D'accord merci, c'est déja une piste : j'arrive a créer des boutons en chaîne.

                    J'essaye donc de déclarer les boutons avec des arguments avec le dico, mais j'ai une erreur sur le nom de la fonction avec la ligne 

                        for i in range (1,17):
                            bpiece[i] = Button(fenetre, image=ppiece[i], height=70, width=33, command=commandpiece[i], state="normal")


                    pourtant je me suis renseigné et j'ai initialisé mon dico avec

                    commandpiece={'1': 'piece1','2': 'piece2', etc }

                    mais toujours la même erreur...

                    Traceback (most recent call last):
                      File "C:\EduPython\App\lib\tkinter\__init__.py", line 1538, in __call__
                        return self.func(*args)
                      File "D:\Leo\Bureau\Quarto\Quarto.py", line 835, in game
                        bpiece[i] = Button(fenetre, image=ppiece[i], height=70, width=33, command=commandpiece[i], state="normal")
                    KeyError: 1


                    J'espère que j'ai été compréhensible ^^'

                    Merci d'avance.

                    -
                    Edité par Leogendra 30 mars 2020 à 19:19:14

                    • Partager sur Facebook
                    • Partager sur Twitter
                      30 mars 2020 à 20:14:44

                      Tu as sans doute pas rempli les dictionnaire ppiece et/ou  commandpiece avant la boucle for.
                      • Partager sur Facebook
                      • Partager sur Twitter

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

                        30 mars 2020 à 20:22:25

                        en si justement, j'ai initialisé commandpiece a la main avec commandpiece={'1':'piece1',...}  (piece1 c'est la fonction)

                        et

                        ppiece[1] = PhotoImage(file='piece1.png')
                        
                        ...



                        -
                        Edité par Leogendra 30 mars 2020 à 20:22:46

                        • Partager sur Facebook
                        • Partager sur Twitter
                          30 mars 2020 à 20:45:37

                          Sauf que si Python lève une KeyError, c'est qu'il ne trouve pas cette clé dans le dictionnaire, donc ça a merdé quelque part.

                          Affiche les deux dictionnaires concernés avec print juste avant la ligne concernée par le bug pour vérifier (procédure de debug de base).

                          EDIT : En relisant ton post, je vois que Python a raison, tu as utilisé "1" comme clé de ton dictionnaire, et pas 1. Donc le problème vient bien du dictionnaire commandpiece.

                          Au passage tu dois mettre le nom de la fonction en valeur du dictionnaire, pas une chaîne de caractères qui contient son nom.

                          -
                          Edité par LoupSolitaire 30 mars 2020 à 20:47:48

                          • Partager sur Facebook
                          • Partager sur Twitter

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

                            30 mars 2020 à 21:18:15

                            Super ! Merci beaucoup j'ai réussi a fix le truc :)

                            J'ai souvent des problemes avec les char en plus en c++, comme quoi ça me suis haha

                            Du coup je doit juste modifier les "case1" en "case[1]", mais ça me permettra quand même de gagner BEAUCOUP de place.

                            Merci encore, bonne fin de soirée !

                            Leogendra

                            • Partager sur Facebook
                            • Partager sur Twitter

                            Synthétisation/Optimisation de code avec lambda

                            × 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