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 :

Liste de dominos exo G.Swinnen 12.1


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Septembre 2010
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : retraité
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Septembre 2010
    Messages : 116
    Par défaut Liste de dominos exo G.Swinnen 12.1
    Salut à tous,
    L'exercice de cet excellent livre, page 172 propose une manip sur une classe 'Domino'.
    Une fois terminée, j'ai essayé de manipuler la liste ainsi créée sans beaucoup de succès.
    Il semble que plusieurs méthodes de liste ne s'appliquent plus à celle-ci.
    En particulier les méthodes ou fonctions 'sort' et 'print'
    Je n'ai pas réussi à afficher simplement le contenu brut de la liste comme --> print(liste)
    En ligne 49 du code ci-après, une valeur 'None' s'affiche sans que je comprenne pourquoi.
    Si quelqu'un a une explication, merci d'avance.
    L.P.

    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
     
    #! /usr/bin/env python
    # -*- coding: UTF-8 -*-
     
    from random import*
     
    liste_dominos=[]
     
    class Domino(object):
        def __init__(self,fA=0,fB=0):
            self.fA=fA
            self.fB=fB
     
        def affiche_points(self):
            print("Face A=", self.fA," et  Face B=", self.fB , end='    ')
     
        def valeur(self):
            return self.fA + self.fB
     
    for i in range (6,-1,-1):
    #    print (i) # pour verif.
        for y in range(0, i + 1):
    #        print (i, y) # pour verif.
            liste_dominos.append(Domino(i, y))
     
    vt = 0
     
    for i in range(28):
        liste_dominos[i].affiche_points()
        print(r"valeur:", liste_dominos[i].valeur())
        vt = vt + liste_dominos[i].valeur()
    print("nombre de dominos: ", len(liste_dominos))
    print("valeur totale des dominos:", vt, "points")
     
    """ les fonctions de tri sont out
    liste_dominos.sort() # renvoi une erreur
    """
     
    ##for i in range(27, -1, -1): # ---sorte de tri inverse---
    ##    liste_dominos[i].affiche_points()
    ##    print(r"valeur:", liste_dominos[i].valeur())
    ##    vt = vt + liste_dominos[i].valeur()
     
    #print(liste_dominos) # donne seulement l'adresse memoire des indices de la liste
     
    t = randrange(28) ; print("tirage: ", t)
    #print(liste_dominos[t]) # donne seulement l'adresse memoire de l'indice [t] de la liste
     
    print(liste_dominos[t].affiche_points(), "valeur: ", liste_dominos[t].valeur())
     
    ## --> renvoi Face A= 1  et  Face B= 1    None valeur:  2 ( si 2 = t )

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Salut,

    Citation Envoyé par luc pic Voir le message
    Il semble que plusieurs méthodes de liste ne s'appliquent plus à celle-ci.
    Une liste d'objets que vous avez créés doit être "adaptée" pour qu'on puisse leur appliquer sort, print,...

    Par exemple, côté "print", s'il n'y a pas de méthode __repr__ ou __str__ pour retourner la chaine de caractères à afficher lorsqu'on fait "print".... ben on aura quelque chose "par défaut".

    Pour sort c'est pareil: trier, c'est pouvoir comparer!
    Soit on écrit les méthodes spéciales qui permettent de ... soit on dit à sort sur quels attributs des objets faire cette comparaison.

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

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par luc pic Voir le message
    En ligne 49 du code ci-après, une valeur 'None' s'affiche sans que je comprenne pourquoi. Si quelqu'un a une explication, merci d'avance.
    Parce que tu affiches (print) le résultat de la méthode "affiche_point()", et que cette méthode ne produit aucun résultat (son travail est elle-même d'afficher à l'écran). Ne retournant rien, alors elle retourne None par défaut.
    Soit tu modifies "affiche_point() pour qu'elle n'affiche rien mais retourne une string à afficher, string que tu pourras alors utiliser dans ton print(), soit tu l'appelles de façon naturelle (sans la "printer d'une quelconque façon) puis tu printes le reste.
    Perso je préfères la première solution => retourner une valeur sans présumer de la façon dont elle sera utilisée (affichée, imprimée, stockée dans un fichier, ...).

    Pour le reste wiztricks a bien résumé. Pour trier une liste de "trucs", il faut que la fonction sort() sache comment "comparer" ces trucs. Heureusmement Python est bien carré. Chaque fois que tu demandes une comparaison sur deux objets, Python fait appel à des méthodes internes "__eq__" (equal), "__ne__" (non equal), "__le__" (less than), "__ge__" (greater than), "__le__" (less or equal) et "__ge__" (greater or equal) à ces objets qui, si elles n'existent pas, sont alors prises par défaut

    Donc si tu veux que Python sache tester une égalité entre 2 dominos, te suffit d'écrire les méthode "__eq__" et "__ne__"
    Exemple
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class Domino(object):
    	def __init__(self, fA=0, fB=0):
    		(self.fA, self.fB)=sorted((fA, fB))
    	def __eq__(self, other): return ((self.fA, self.fB) == (other.fA, other.fB))
    	def __ne__(self, other): return not self == other
     
    print(Domino(2, 3) == Domino(3, 2))
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Membre confirmé
    Homme Profil pro
    retraité
    Inscrit en
    Septembre 2010
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : retraité
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Septembre 2010
    Messages : 116
    Par défaut Python 3.x
    Salut à tous et merci pour vos réponses,
    J'ai un peu tardé à revenir sur le sujet car j'ai cherché en vain pourquoi je n'arrive pas à obtenir l'affichage 'brut' de la liste "liste_dominos" par la simple fonction 'print()'.
    Par contre pour None, j'ai bien compris que dans ce cas la fonction 'print()' fait double emploi en quelque sorte puisqu'elle est déjà dans 'affiche_points'.
    L.P

Discussions similaires

  1. aide exo 9.4 d'apprendre python 3 de Gerard Swinnen
    Par loicsu33 dans le forum Exercices
    Réponses: 14
    Dernier message: 27/08/2020, 08h16
  2. [Python 3.X] Exo tp listes en python
    Par Power Lousse dans le forum Général Python
    Réponses: 3
    Dernier message: 11/12/2015, 20h09
  3. Probleme liste Exercice 93 Swinnen
    Par loncle dans le forum Général Python
    Réponses: 2
    Dernier message: 27/08/2014, 14h39
  4. [Exo] Problèmes - fusion de listes
    Par Shiinra dans le forum Général Python
    Réponses: 6
    Dernier message: 14/05/2011, 16h47
  5. [Inutile] Vos solutions pour l'exo 8.32 du tuto de Swinnen
    Par PauseKawa dans le forum Général Python
    Réponses: 1
    Dernier message: 21/02/2011, 00h40

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