IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Problème de compréhension d'un morceau de code


Sujet :

Python

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2020
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 22
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2020
    Messages : 7
    Points : 6
    Points
    6
    Par défaut Problème de compréhension d'un morceau de code
    Bonsoir , je suis le cour apprenez à programmer en python, je suis au niveau de la correction d'un TP pour créer un dictionnaire ordonné.

    Voici mon le programme que j'ai réalisé (je n'est pas réussi l'exercice en sa totalité) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    class DictionnaireOrdre:
        """classe qui se comporte comme un dictionnaire
        mais qui a un ordre précis"""
     
        def __init__(self,**dico):
            """quand l'objet se crée le dictionnaire
            qui est rentré en argument est divisé en 2 listes"""
     
            self.clef = [key for key in dico.keys()]
            self.valeur = [values for values in dico.values()]
     
        def __delitem__(self, clef):
            """méthode pour supprimer la clef 
            et la valeur"""
            index = self.clef.index(clef)
            del self.valeur[index]
            del self.clef[index]
     
        def __getitem__(self, clef):
            """méthode appelé quand on fait
            objet[index]"""
            try:
              index = self.clef.index(clef)
              return self.valeur[index]
            except ValueError:
                raise KeyError("Key {} is not in dict".format(clef))
     
        def __setitem__(self, cle, valeur):
            """méthode qui ajoute cle + valeur 
            au dictionnaire, si la cle existe 
            on écrase la valeur associé, sinon
            on ajoute le couple cle + valeur"""
     
            if cle in self.clef:
                index = self.clef.index(cle)
                self.valeur[index] = valeur
            else:
                self.clef.append(cle)
                self.valeur.append(valeur)
     
        def __contains__(self, cle):
            """renvoi true si la cle est dans 
            le dictionnaire ou false si elle 
            n'y est pas"""
     
            if cle in self.clef:
                return True
            else:
                return False
     
        def __len__(self):
            """renvoi le nombre d'items dans
            le dictionnaire"""
     
            return len(self.clef)
     
        def keys(self):
            """méthode qui renvoi les clefs du
            dictionnaire"""
     
            i = 0
            while i < len(self.clef):
                yield self.clef[i]
                i += 1
     
        def values(self):
            """méthode qui renvoi les valeurs du 
            dictionnaire"""
     
            i = 0
            while i < len(self.valeur):
                yield self.valeur[i]
                i += 1
     
        def items(self):
            """méthode qui renvoi valeurs + clef"""
     
            i = 0
            while i < len(self.clef):
               yield self.valeur[i], self.clef[i]
               i += 1
     
        def __add__(self, objet):
            """méthode pour ajouter deux
            objet DictionnaireOdre entre eux"""
     
            self.clef += objet.clef 
            self.valeur += objet.valeur
    et voici le morceau de la correction que je ne comprend pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    27
    class DictionnaireOrdonne:
        """Notre dictionnaire ordonné. L'ordre des données est maintenu
        et il peut donc, contrairement aux dictionnaires usuels, être trié
        ou voir l'ordre de ses données inversées"""
     
        def __init__(self, base={}, **donnees):
            """Constructeur de notre objet. Il peut ne prendre aucun paramètre
            (dans ce cas, le dictionnaire sera vide) ou construire un
            dictionnaire remplis grâce :
            -   au dictionnaire 'base' passé en premier paramètre ;
            -   aux valeurs que l'on retrouve dans 'donnees'."""
     
            self._cles = [] # Liste contenant nos clés
            self._valeurs = [] # Liste contenant les valeurs correspondant à nos clés
     
            # On vérifie que 'base' est un dictionnaire exploitable
            if type(base) not in (dict, DictionnaireOrdonne):
                raise TypeError( \
                    "le type attendu est un dictionnaire (usuel ou ordonne)")
     
            # On récupère les données de 'base'
            for cle in base:
                self[cle] = base[cle]
     
            # On récupère les données de 'donnees'
            for cle in donnees:
                self[cle] = donnees[cle]
    Je ne le comprend pas car quand je le tape dans mon éditeur de code, il me renvoi un message d'erreur, "'self' does not support item assignmentpylint(unsupported-assignment-operation)"
    pour les deux boucles for sur la variable self[cle], je comprend cette erreur car je ne trouve pas cela logique, on veut deux listes une avec les clefs du dictionnaire et l'autre
    avec les valeurs associer aux clefs, donc si je comprend bien le programme on n'affecte pas les valeurs je veux dire aucunes listes définies dans _init__ ne contiendras
    les valeurs du dictionnaire.
    De plus self tout seul ne signifie rien ?
    Je suis débutant en python et je commence à peine à comprendre comment marchent les classes.

    Merci d'avance pour l'aide

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 273
    Points : 36 757
    Points
    36 757
    Par défaut
    Salut,

    Citation Envoyé par Wuzei Voir le message
    Je ne le comprend pas car quand je le tape dans mon éditeur de code, il me renvoi un message d'erreur, "'self' does not support item assignmentpylint(unsupported-assignment-operation)"
    Votre éditeur de code n'est pas l'interpréteur Python.

    Côté Python, self[cle] = ... ne sera évalué que lorsque l'instruction sera exécutée.

    A ce moment là, si l'objet a une méthode __setitem__, l'interpréteur saura quoi appeler.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2020
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 22
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2020
    Messages : 7
    Points : 6
    Points
    6
    Par défaut
    D'accord , mais si j’exécute le code juste avec __init__ sans avoir crée de méthode __setitem__ cela ne va pas marcher pourquoi ?

    Quand on crée un objet __setitem__ est appelé si il existe ?

    Je viens de tester avec __init__ + __setitem__ et ça marche mais sans __setitem__ ça ne marche pas.

    PS: Voici le code de __setitem__:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    def __setitem__(self, cle, valeur):
            """Méthode spéciale appelée quand on cherche à modifier une clé
            présente dans le dictionnaire. Si la clé n'est pas présente, on l'ajoute
            à la fin du dictionnaire"""
     
            if cle in self._cles:
                indice = self._cles.index(cle)
                self._valeurs[indice] = valeur
            else:
                self._cles.append(cle)
                self._valeurs.append(valeur)

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 273
    Points : 36 757
    Points
    36 757
    Par défaut
    Salut,

    Citation Envoyé par Wuzei Voir le message
    D'accord , mais si j’exécute le code juste avec __init__ sans avoir crée de méthode __setitem__ cela ne va pas marcher pourquoi ?
    Çà fonctionne parce que les concepteurs de Python ont décidé que l'écriture a[x] = c était équivalente à a.__setitem__(x, c).
    Et vous avez plein de méthodes "spéciales" (les __machin__) qui se cachent derrière les opérations simples comme a * b, a + b, ...

    Après "pourquoi", c'est certainement parce que c'est ce qu'on attend de l'accès à un tableau depuis qu'on a inventé cette notation.
    Mais si vous voulez apprendre à programmer avec Python, il va falloir apprendre à faire avec.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Avril 2020
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 22
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Avril 2020
    Messages : 7
    Points : 6
    Points
    6
    Par défaut
    D'accord merci pour vos réponses ! je suis en plein dans l’apprentissage des méthodes spéciales.

    J'ai vue dans votre description que vous proposer des tutoriels pouvez vous me donner les liens svp pour compléter mon apprentissage.

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 273
    Points : 36 757
    Points
    36 757
    Par défaut
    Citation Envoyé par Wuzei Voir le message
    pouvez vous me donner les liens svp pour compléter mon apprentissage.
    Il suffit de cliquer sur le texte de la description qui est un lien vers...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème de compréhension de code
    Par jaki199 dans le forum Général Java
    Réponses: 5
    Dernier message: 14/05/2011, 22h26
  2. Problème de compréhension de code
    Par Aphroditeuh dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 16/06/2009, 13h28
  3. problème de compréhension de code
    Par condor_01 dans le forum C
    Réponses: 5
    Dernier message: 26/09/2007, 12h17
  4. Réponses: 10
    Dernier message: 11/04/2007, 11h14
  5. Petit problème de compréhension d'une ligne de code
    Par totoc1001 dans le forum Images
    Réponses: 3
    Dernier message: 12/03/2007, 21h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo