Partage
  • Partager sur Facebook
  • Partager sur Twitter

Ces codes sont ils identiques ?

Sujet résolu
Anonyme
    23 septembre 2014 à 20:52:03

    Bonjour j'ai 2 codes, un optimisé par mes soins mais qui peut encore l'être je pense, et un autre répétitif et long et je souhaiterai être sur que ces 2 codes font exactement la même chose.

    Code1 pas optimisé:

    if   nourriture[0] == "0": nourriture[0] = "Raie"
    elif nourriture[1] == "0": nourriture[1] = "Raie"
    elif nourriture[2] == "0": nourriture[2] = "Raie"
    elif nourriture[3] == "0": nourriture[3] = "Raie"
    elif nourriture[4] == "0": nourriture[4] = "Raie"
    elif nourriture[5] == "0": nourriture[5] = "Raie"
    elif nourriture[6] == "0": nourriture[6] = "Raie"
    elif nourriture[7] == "0": nourriture[7] = "Raie"
    elif nourriture[8] == "0": nourriture[8] = "Raie"
    else: message_affiche("Quel dommage ! Votre sac à nourriture est plein, vous relâchez donc votre prise à l'eau . . .")



    Code 2 optimisé :

    for NOURRI_elt, NOURRI_val in enumerate(nourriture):
        if NOURRI_elt == "0":
    	    nourriture[NOURRI_val] = "Esturgeon"
        elif NOURRI_val >= 8 and NOURRI_elt != "0":
    	    message_affiche("Quel dommage ! Votre sac à nourriture est plein, vous relâchez donc votre prise à l'eau . . .")


    Ici nourriture est une liste de ce type :

    nourriture = ["Hareng", "0", "0", "0", "0", "0", "0", "0", "0"]

    Merci de votre aide et expertise ! :D

    -
    Edité par Anonyme 23 septembre 2014 à 20:52:47

    • Partager sur Facebook
    • Partager sur Twitter
      23 septembre 2014 à 21:36:24

      Non, ce n'est pas la même chose.

      La fonction enumerate() renvoie d'abord l'indice et ensuite l'élément:

      for indice, poisson in enumerate(nourriture):

      Ensuite je comprends pas elif NOURRI_val >=8 and NOURRI_elt != "0". Il vaudrai mieux mettre: elif "0" not in nourriture (Si il n'y a plus de 0 dans la liste, alors c'est plein)

      Au final:

      if "0" not in nourriture:
          print("Quel dommage ! Votre sac à nourriture est plein, vous relâchez donc votre prise à l'eau . . .")
      else:
          for NOURRI_ind, NOURRI_elt in enumerate(nourriture):
              if NOURRI_elt == "0":
                  nourriture[NOURRI_ind] = "Esturgeon"





      -
      Edité par Olygrim 23 septembre 2014 à 23:01:48

      • Partager sur Facebook
      • Partager sur Twitter
      Précepte: Le mieux est l'ennemi du bien
        24 septembre 2014 à 10:05:46

        Je suis pas bien fan de cette façon de faire. C'est inefficace à souhait.

        Le but c'est de limiter l'inventaire à 9 items ?

        Dans ce cas il suffit d'utiliser les listes de Python pour ce qu'elles sont : des listes. Au moment de rajouter un item on vérifie la longueur de la liste, si elle est égale à 9, on gère l'erreur, sinon, on utilise la méthode append().

        • Partager sur Facebook
        • Partager sur Twitter
        Zeste de Savoir, le site qui en a dans le citron !
          24 septembre 2014 à 10:30:44

          "Le but c'est de limiter l'inventaire à 9 items ?"

          C'est pour ça que sa condition me paraissait bizarre. Je pensais qu'il voulais juste modifier sa liste et remplacer les "0" par d'autres valeurs

          PS: ce n'est pas une bonne façon d'aborder le problème que de passer d'abord par l'écriture des lignes répétitives. Il faut tout de suite penser avec une boucle, en regardant ce qui va évoluer (quitte à faire quelques erreurs ;)). Disons simplement que je ne trouve pas naturelle de faire cette pré-étape (du moins de l'écrire, pas de la penser), même pour un débutant (ce que je suis encore, et il ne me semble pas être passé par cette étape, ayant rapidement compris l'intérêt et la puissance des boucles).

          • Partager sur Facebook
          • Partager sur Twitter
          Précepte: Le mieux est l'ennemi du bien
          Anonyme
            24 septembre 2014 à 13:05:43

            Oki j'ai compris. Avec une compréhension, je fais un one-liner donc j'évite des lignes inutiles et ca marche non ?

            [index, elt for index, elt in enumerate(LISTE) if elt == "0": LISTE[index] = "OBJET"]

            PS: oui je veux remplacer les "0" par des objets

            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              24 septembre 2014 à 13:09:31

              Déjà la conception est mauvaise, quand on veut indiquer à un élément qu'il n'y a rien, on met None

              nourriture = [None for i in range(9)]

              Ensuite pourquoi ajouter le même élément ? Imaginons que l'on souhaite ajouter un élément dans le cas où l'on connaît son indice et dont la condition est de vérifier qu'il n'y pas déjà présence de l'élément.

              def addElem(myList, ind, elem):
                  if not myList[ind]:
                      myList[ind] = elem
              

              Bon après rien n'empêche d'ajouter les mêmes éléments

              for ind, elem in enumerate(nourriture):
                  addElem(nourriture, ind, "Raie")

              Au moins addElem permet de rendre le code maintenable au cas où on veut ajouter un élément différent à un endroit spécifique de la liste nourriture.



              • Partager sur Facebook
              • Partager sur Twitter
                24 septembre 2014 à 14:25:28

                ATTENTION à ne pas confondre lignes inutiles (à savoir code répétitif) et raccourcissement de code (one-liner).

                Ici, il n'y a aucun intérêt à utiliser un one-liner (surtout quand ils ne sont pas maîtrisés). Ton dernier code ne fonctionne pas. D'où ma question: Testes-tu tes codes après les avoir écrit? C'est le meilleur moyen de progresser, mettre ton code dans un fichier et le lancer dans la console pour voir ce qui en sort.

                Bon, partons du principe que tu souhaite gérer un inventaire. Comme le souligne nohar, la mauvaise pratique est de définir une liste initiale de la taille qu'on souhaite et de remplacer les éléments au fur et à mesure. Python dispose de méthode de classe fantastique. Par exemple, pour la classe list(), il y a la méthode append() qui permet d'ajouter des éléments, les méthodes pop() et remove() qui en supprime, etc... Dans ton cas, tu faudrait commencer avec une liste vide, et la remplir au fur et à mesure:

                liste_poissons = list()
                
                #Ajout
                liste_poissons.append("Bar")
                liste_poissons.append("Morue")
                liste_poissons.append("Vieille Botte?")
                
                #Suppression par index:
                liste_poissons.pop(1)  #Va supprimer "Morue" de la liste
                
                #Supprimer le dernier élément:
                liste_poissons.pop()  #Va supprimer "Vieille Botte?"
                
                #Suppression par valeur:
                liste_poissons.remove("Bar")  #Ai-je besoin d'expliciter
                
                #Notre liste est à nouveau vide



                Si tu as une taille limite à respecter:

                if len(liste_poissons) <= 8:
                    liste_poissons.append("Bigorneau")
                else:
                    print("Ton packetage est plein")



                Mais est-ce vraiment ce que tu veux faire?



                Une dernière chose: Python est un langage remarquable, dont les outils de base (liste, tuple, dictionnaire, boucles for et while, fonction, etc...) sont très riches (notamment en méthodes). Il est dommage de passer à côté, aussi tu devrais prendre un peu de temps pour voir ces concepts. Les méthodes d'une classe s'utilise grâce au . Et pour avoir la liste des méthodes d'une classe (par exemple les listes): dir(list). Il y a également des fonctions intégrées (fonctions générales), pour avoir leur liste: dir(__builtins__). Par exemple, len, max et min sont des fonctions intégrées. Le détail s'obtient avec help: help(list.pop), help(max).



                -
                Edité par Olygrim 24 septembre 2014 à 14:31:48

                • Partager sur Facebook
                • Partager sur Twitter
                Précepte: Le mieux est l'ennemi du bien
                  24 septembre 2014 à 14:49:28

                  Juste petite erreur de rien du tout dans ce que tu dit olygrim: on peut très bien utiliser help() pour avoir la doc d'une classe en entier (par exemple help(list), ce que je fais), ce n'est pas réservé au détail.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    24 septembre 2014 à 14:53:41

                    Exact. C'est vrai que je l'utilise rarement comme ça (sauf pour connaître le nom des package d'une bibliothèque), mais plus au cas par cas :)
                    • Partager sur Facebook
                    • Partager sur Twitter
                    Précepte: Le mieux est l'ennemi du bien
                    Anonyme
                      24 septembre 2014 à 16:18:19

                      Oui tu as raison il faut mettre None pour rendre "vide" une liste mais cela affichera . . . rien. et moi je souhaite que 0 s'affiche pour indiquer un emplacement disponible.

                      Olygrim a écrit:

                      ATTENTION à ne pas confondre lignes inutiles (à savoir code répétitif) et raccourcissement de code (one-liner).

                      Ici, il n'y a aucun intérêt à utiliser un one-liner (surtout quand ils ne sont pas maîtrisés). Ton dernier code ne fonctionne pas. D'où ma question: Testes-tu tes codes après les avoir écrit? C'est le meilleur moyen de progresser, mettre ton code dans un fichier et le lancer dans la console pour voir ce qui en sort.

                      J'aurais bein aimé mais j'ai du partir au boulot juste apres avoir posté.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        24 septembre 2014 à 17:20:00

                        "Oui tu as raison il faut mettre None pour rendre "vide" une liste mais cela affichera . . . rien"

                        >_<

                        • Partager sur Facebook
                        • Partager sur Twitter
                        Précepte: Le mieux est l'ennemi du bien
                        Anonyme
                          24 septembre 2014 à 17:27:51

                          La liste n'est pas vide, elle est composée d'éléments attendant une assignation par l'indice.

                          >>> liste = [None for i in range(9)]
                          >>> liste
                          [None, None, None, None, None, None, None, None, None]
                          >>> for i in liste:
                          ...     print(i)
                          ... 
                          None
                          None
                          None
                          None
                          None
                          None
                          None
                          None
                          None
                          

                          "0", None ou autres, l'essentiel c'est ce que représente l'élément pour toi... dans ton cas, si tu ne connais pas le type, ou la valeur d'un élément, on met None, après on peut afficher ce qu'on veut à la place de None

                          >>> for i in liste:
                          ...     if not i:
                          ...         print("0")
                          ... 
                          0
                          0
                          0
                          0
                          0
                          0
                          0
                          0
                          0
                          




                          • Partager sur Facebook
                          • Partager sur Twitter
                          Anonyme
                            24 septembre 2014 à 17:37:09

                            Ah oui d'accord. Désolé j'avais pas compris.

                            Vos codes insérent tous un seul élement mais en plein d'exemplaire donc je part de ceci : ["0"] * 8 et j'obitens ceci : ["POISSON"] * 8.

                            Donc j'ai pensé à une variable qui s'incrémente au début de la boucle et à la fin on test si elle vaut 1, si oui, on break.

                            • Partager sur Facebook
                            • Partager sur Twitter

                            Ces codes sont ils identiques ?

                            × 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