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 :

dictionnaire et random


Sujet :

Python

  1. #1
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2014
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2014
    Messages : 35
    Par défaut dictionnaire et random
    Bonsoir à tous,

    Depuis plusieurs heures, je cherche à créer un exercice que je mets en pièce jointe. untitled.py
    J'ai crée un dictionnaire {'métal' : densité, ...}
    Dans def réponse_cube() : je souhaiterais pouvoir récupérer la densité du métal qui a été choisi c'est ce que n'arrive pas à faire.

    Merci pour votre aide
    Pierre

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

    Citation Envoyé par pir2Paris Voir le message
    J'ai crée un dictionnaire {'métal' : densité, ...}
    Certes mais à quoi bon si vous ne savez pas l'utiliser?
    Les dictionnaires sont une structure de base (et essentielle) au langage, tous les bons tutos vous en donnent le mode d'emploi dans un chapitre dédié.

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

  3. #3
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 078
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 078
    Par défaut
    Autres questions,

    • Pourquoi les 2 dictionnaires identiques dans le même code ?
    • Pourquoi mettre des accents à des noms de variables ?
    • Pourquoi mettre des mots clé global partout ?


    EDIT:

    Côté présentation, c'est plus agréable de représenter un dictionnaire de cette manière concernant votre cas,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    metaux={
            'fer': 7.9,
            'plomb': 11.4,
            'or': 19.3,
            'aluminium': 2.7,
            'cuivre': 9,
            'argent': 10.5,
            'zinc': 7.1
           }
    Vous pouvez aussi exprimer ce que vous souhaitez faire de ce résultat (placer dans un widget Label, Entry, Canvas, ... ? )

  4. #4
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2014
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2014
    Messages : 35
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,



    Certes mais à quoi bon si vous ne savez pas l'utiliser?
    Les dictionnaires sont une structure de base (et essentielle) au langage, tous les bons tutos vous en donnent le mode d'emploi dans un chapitre dédié.

    - W
    J'ai suivi votre conseil et, effectivement, j'avais la solution sous les yeux et je ne l'avais pas vue.
    Merci à vous

  5. #5
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2014
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2014
    Messages : 35
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    Autres questions,

    • Pourquoi les 2 dictionnaires identiques dans le même code ?
    • Pourquoi mettre des accents à des noms de variables ?
    • Pourquoi mettre des mots clé global partout ?


    EDIT:

    Côté présentation, c'est plus agréable de représenter un dictionnaire de cette manière concernant votre cas,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    metaux={
            'fer': 7.9,
            'plomb': 11.4,
            'or': 19.3,
            'aluminium': 2.7,
            'cuivre': 9,
            'argent': 10.5,
            'zinc': 7.1
           }
    Vous pouvez aussi exprimer ce que vous souhaitez faire de ce résultat (placer dans un widget Label, Entry, Canvas, ... ? )
    Bonjour fred1599,

    Je vous remercie pour votre réponse.
    J'ai remanié le code en essayant de le simplifier :
    La présentation d'un dictionnaire sous cette forme ne me semble pas "meilleure" s'il y a moins d'une dizaine d'éléments, c'est tout aussi lisible ;
    il y a maintenant deux dictionnaires car j'ai séparé les métaux dont l'initiale est une voyelle de ceux dont l'initiale est une consonne pour une question de français (la densité de l'or, du cuivre).
    L'accent à "métaux" est-il vraiment si gênant que çà ?
    Concernant le mot-clé global, je fais un exercice "répétitif" pour mes élèves.
    Sans cela, j'aurai toujours le même exercice ou bien les valeurs de la réponse ne correspondraient pas à celles de l'énoncé.
    Je vous joins l'exercice complet ; si vous voyez des simplifications ou des améliorations, je serais content que vous me les signaliez.

    Bonne journée à vous.
    Pierre
    Fichiers attachés Fichiers attachés

  6. #6
    Membre Expert

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Par défaut
    Plutot que d'écrire des variables globales partout (qui vous metterons dedans un jour où l'autre), faites :
    1) retourner des choses par vos fonctions
    2) dépendre vos fonctions de paramètre

    Là en l'occurence à la fin de la fonction cube vous écrivez :
    et vous n'avez pas à différencier m1 et m2, ca sera m tout simplement dans les 2 cas.

    Et réponse_cube débuterait ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    def réponse_cube(p,k,e,m):
    Avec Tkinter pas sûr que récupérer la sortie d'une fonction soit facile, mais encapsuler vos fonction dans une classe devrait vous permettre de faire très simplement cela. En plus ca permettra d'avoir des variables globales à la classe (ce qui vous assure que ça n'impactera pas ailleurs).

    Ensuite éviter la recopie de code. Dans reponse cube, pourquoi ne pas écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        if p==1:
            métaux=métaux1    
        else :
            métaux=métaux2
    Et ensuite de faire votre série de print sur la variable métaux plutot que d'avoir a dupliquer métaux1 et métaux2 alors qu'on leur applique exactement le même traitement.

  7. #7
    Membre Expert

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Par défaut
    Je viens de voir pourquoi vous distinguez metaux1 et 2 : histoire de faire la contraction des le et de si ca démarre par une voyelle. Bon c'est bien de vouloir respecter le francais, mais c'est pas du tout la bonne maniere de faire.

    Voici un code qui regroupe un peu toute mes remarques :

    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
    #!/usr/bin/python
    from tkinter import *
    import random
    from tkinter.messagebox import *
     
    def du(nom):
        ### On teste si la premiere lettre du nom est une voyelle
        if nom[0] in 'aeiouy' : 
            #### exemple : de l'or
            return "de l'"+nom
        else :
            #### exemple : du cuivre
            return "du "+nom
     
    def de(nom):
        if nom[0] in 'aeiouy' : 
            #### exemple : d'or
            return "d'"+nom
        else :
            #### exemple : de cuivre
            return "de "+nom
     
     
    class CubeMetallique :
    		metaux={'fer':7.9,'plomb':11.4,'cuivre':9,'zinc':7.1,'platine':21.5,'nickel':8.3,"or":19.3,"aluminium":2.7,"argent":10.5,'étain':7.3}
     
    		def __init__(self,k,e,m):
    				self.k=k
    				self.e=e
    				self.m=m
    				self.densite = self.metaux[self.m]
    				self.V=(10*self.k*self.e)**3
     
                    @classmethod
    		def create_randomly(cls):
    				k=random.choice(range(1,20)) 
    				e=random.choice(range(1,20)) 
    				m=random.choice(list(cls.metaux))
    				return cls(k,e,m)
     
    		def print_enonce_cube(self):			
    				print("Une masse cubique en",self.m,"a",self.k*self.e,"cm d’arête. On la transforme en une feuille de",self.e,"mm d’épaisseur.")
    				print("Quelle est la surface de cette feuille ?")
    				print("Quel est le poids (la masse) d'un mètre carré de cette feuille ?")
    				print(' ')   
     
    		def reponse_cube(self):
    				print("On peut considérer le cube comme un pavé droit dont l'épaisseur serait égale à la longueur de l'arête")
    				print("Donc, l’épaisseur du cube est égale à",self.k*self.e,"cm =",10*self.k*self.e,"mmm.")
    				print("L’épaisseur de la feuille est",10*self.k*self.e,"/",self.e,"=",10*self.k,"fois plus petite donc, puisque le volume est constant,")
    				print("l’aire de la feuille est",10*self.k,"fois plus grande :")
    				print(10*self.k*self.e,'x',10*self.k*self.e,"×",10*self.k,"=",1000*self.k**3*self.e**2,"mm2 =",10*self.k**3*self.e**2,"cm2 =",self.k**3*self.e**2/10,"dm2 =",self.k**3*self.e**2/1000,"m2")
    				print(' ')
    				print("La densité",du(self.m),"est égale à", self.densite,"cela signifie que ")
    				print("1 dm3 ",de(self.m),"a une masse de",self.densite,"kg ou")
    				print("1 m3 = 10**3 dm3 ",de(self.m),"a une masse de",self.densite,"x 10**3 kg =",self.densite,"t") 
    				print("La masse de",self.V/10**9,"m3 ",de(self.m),"est égale à",self.densite,"x",self.V/10**9,"t =",self.densite*self.V/10**9,"t")
    				print("La masse de 1 m2 de cette feuille est égale à :",self.densite*self.V/10**9,"t/",self.V/((10**6)*self.e),"m2 =",self.densite*self.e/1000,"t =",self.densite*self.e,"kg")   
    				print(' ')
    				print(' ')
    				print("Solution utilisant le volume et la surface")
    				print("Le volume d’un cube est c × c × c = c**3 ; il faut convertir toutes les mesures dans la même unité,")
    				print("il est plus simple de convertir",self.k*self.e,"cm en mm, donc,",self.k*self.e,"cm = 10 x",self.k*self.e,"=",10*self.k*self.e,"mm donc,")
    				print("le volume du cube est égal à",10*self.k*self.e,"x",10*self.k*self.e,"x",10*self.k*self.e,"=",self.V,"mm3 =",self.V/10**3,"cm3 =",self.V/10**6,"dm3 =",self.V/10**9,"m3")
    				print("La feuille a le même volume que le cube donc,")
    				print("S = V/e =",self.V,"/",self.e,"=",self.V/self.e,"mm2 =",self.V/(100*self.e),"cm2 =",self.V/((10**4)*self.e),"dm2 =",self.V/((10**6)*self.e),"m2")
    				print(' ')
    				print(' ')
    				print(' ')
     
     
    cube = CubeMetallique.create_randomly()
     
    fenetre = Tk()
    canvas = Canvas(fenetre, width=100, height=20, background='white')
    canvas.pack(side =TOP, padx =5, pady =5)
    bouton1 = Button(fenetre, text ='cube', command = cube.print_enonce_cube)
    bouton1.pack(side =TOP, padx =10, pady =10)
    bouton3 = Button(fenetre, text ='réponse_cube', command = cube.reponse_cube)
    bouton3.pack(side =RIGHT, padx =10, pady =10)
    fenetre.mainloop()

  8. #8
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 078
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 078
    Par défaut
    Alors il y a beaucoup de choses à dire,

    Collègue en ISN ? Si oui, je comprends les difficultés, pour avoir formé quelques uns de mes camarades ISN, ce fût dur quand à l'apprentissage... Rien que de faire comprendre le passage à la version 3.x du langage.

    Avez-vous des stages concernant certains langages de programmation ? Question que je me pose aujourd'hui, car il y a 5 à 6 ans il n'en était pas question.

    Pour un débutant voici mes conseils,
    1. Pas de mot clé global, car à partir de ce moment, ça va sentir très mauvais niveau conception et mauvaises habitudes (tendance aux rustines)
    2. Rendre lisible au maximum son code, penser à des futures extensions liées aux contraintes
    3. Suivre les normes/conventions actuelles (le forum est un bon moyen de les suivre)
    4. Une fonction ne doit jamais afficher mais retourner un/des objets python (afficher en italique pour de rares exceptions, pas ton cas actuellement)
    5. Supprimer tout code répétitif lorsqu'on a évidemment bien vérifié que son code est fonctionnel (c'est un genre de factorisation)
    6. Une fonction est utilisée pour du code répétitif ou pour exprimer la manière conceptuelle de résoudre une problématique
    7. En lisant son code on doit comprendre les différentes étapes pour résoudre sa problématique, si ne n'est pas le cas, modifier nom des variables, fonctions, classes, etc.


    Concernant ton code, plein de choses me choquent, et le terme choquer est faible, je ne comprend pas ceci par exemple,

    Citation Envoyé par pir2Paris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    global k
        k
        global e
        e
     
        global p
        p
    Dans quel tutoriel on lit cela ? Il faut remettre les choses au point, le mot clé global c'est pour une rustine exceptionnellement sur un code de 500/1000 lignes, quand on se rend compte qu'une modification non réfléchie casse le code. Mais sur ton code, ce mot clé est inutile, d'ailleurs en réalité si tu le retires, tu changeras pas grand chose au fonctionnement me semble-t-il car dans tes fonctions tu ne modifies à aucun instant tes variables k, e et p.
    Donc tu peux les virer gentillement.

    Les print dans les fonctions faut oublier, le texte est répétitif mais n'est aussi pas à sa place, soit tu crées une fonction d'affichage, soit tu places cela correctement dans ton code principal (hors fonctions)

    Pour des print multiples utiliser les triples quotes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    print("""ligne1
    ligne2
    ligne3"""
    Après l'utilisation de Tkinter, déjà que python c'est dur mais on se rajoute une difficulté... bref allons-y !

    Il existe des objets permettant de manipuler les données dans les fonctions justement pour éviter le mot clé global.
    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    >>> from tkinter import Tk, IntVar
    >>> def test(n):
    ...     value.set(n)
    ...     return value.get()
    ... 
    >>> root = Tk()
    >>> value = IntVar()
    >>> test(3)
    3
    >>> value.get() # la valeur de la variable value est modifiée dans la fonction
    3
    mais encore une fois, est-ce un besoin ? Pas sûr, car tes mots clés global n'ont aucun intérêt dans ton code.

    il y a maintenant deux dictionnaires car j'ai séparé les métaux dont l'initiale est une voyelle de ceux dont l'initiale est une consonne pour une question de français (la densité de l'or, du cuivre).
    Bof, voir le code de lg_53, qui pourrait encore être simplifié, mais pédagogiquement, est-ce important, plutôt que la conception à la résolution du problème ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    def du(nom, debut="de l'"):
        if nom[0] not in 'aeiouy' : 
            debut = "du "
        return debut + nom
    bref, ce détail n'est pas important ! Si ?

    Concernant le mot-clé global, je fais un exercice "répétitif" pour mes élèves.
    J'ai pas compris...

    La présentation d'un dictionnaire sous cette forme ne me semble pas "meilleure" s'il y a moins d'une dizaine d'éléments, c'est tout aussi lisible ;
    Sauf que des métaux, il y en a bien plus qu'une dizaine, prévoir un code maintenable et maniable, c'est un code fort et prêt à tous les changements

    Je vous joins l'exercice complet ; si vous voyez des simplifications ou des améliorations, je serais content que vous me les signaliez.
    Avec tous les renseignements donnés au début de ma réponse, tu ne peux qu'améliorer et mieux concevoir ton code. Il en sera simplifié et plus agréable à la lecture. Et je comprend tes difficultés, j'ai formé des collègues qui partaient de bien plus loin que toi, ils s'en sortent, c'est rassurant pour toi et tes collègues dans la même situation.

    Bon courage, et à bientôt pour une nouvelle présentation de code je l'espère sans le mot clé global. N'hésites pas à poser des questions... et testes beaucoup avec ton interpréteur (c'est la clé pour réussir à comprendre les petites lignes de code et ce que python comprend).

    Ouf, pas l'habitude d'écrire autant, mais c'est pour la bonne cause

  9. #9
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2014
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2014
    Messages : 35
    Par défaut
    Citation Envoyé par lg_53 Voir le message
    Je viens de voir pourquoi vous distinguez metaux1 et 2 : histoire de faire la contraction des le et de si ca démarre par une voyelle. Bon c'est bien de vouloir respecter le francais, mais c'est pas du tout la bonne maniere de faire.

    Voici un code qui regroupe un peu toute mes remarques :

    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
    #!/usr/bin/python
    from tkinter import *
    import random
    from tkinter.messagebox import *
     
    def du(nom):
        ### On teste si la premiere lettre du nom est une voyelle
        if nom[0] in 'aeiouy' : 
            #### exemple : de l'or
            return "de l'"+nom
        else :
            #### exemple : du cuivre
            return "du "+nom
     
    def de(nom):
        if nom[0] in 'aeiouy' : 
            #### exemple : d'or
            return "d'"+nom
        else :
            #### exemple : de cuivre
            return "de "+nom
     
     
    class CubeMetallique :
    		metaux={'fer':7.9,'plomb':11.4,'cuivre':9,'zinc':7.1,'platine':21.5,'nickel':8.3,"or":19.3,"aluminium":2.7,"argent":10.5,'étain':7.3}
     
    		def __init__(self,k,e,m):
    				self.k=k
    				self.e=e
    				self.m=m
    				self.densite = self.metaux[self.m]
    				self.V=(10*self.k*self.e)**3
     
                    @classmethod
    		def create_randomly(cls):
    				k=random.choice(range(1,20)) 
    				e=random.choice(range(1,20)) 
    				m=random.choice(list(cls.metaux))
    				return cls(k,e,m)
     
    		def print_enonce_cube(self):			
    				print("Une masse cubique en",self.m,"a",self.k*self.e,"cm d’arête. On la transforme en une feuille de",self.e,"mm d’épaisseur.")
    				print("Quelle est la surface de cette feuille ?")
    				print("Quel est le poids (la masse) d'un mètre carré de cette feuille ?")
    				print(' ')   
     
    		def reponse_cube(self):
    				print("On peut considérer le cube comme un pavé droit dont l'épaisseur serait égale à la longueur de l'arête")
    				print("Donc, l’épaisseur du cube est égale à",self.k*self.e,"cm =",10*self.k*self.e,"mmm.")
    				print("L’épaisseur de la feuille est",10*self.k*self.e,"/",self.e,"=",10*self.k,"fois plus petite donc, puisque le volume est constant,")
    				print("l’aire de la feuille est",10*self.k,"fois plus grande :")
    				print(10*self.k*self.e,'x',10*self.k*self.e,"×",10*self.k,"=",1000*self.k**3*self.e**2,"mm2 =",10*self.k**3*self.e**2,"cm2 =",self.k**3*self.e**2/10,"dm2 =",self.k**3*self.e**2/1000,"m2")
    				print(' ')
    				print("La densité",du(self.m),"est égale à", self.densite,"cela signifie que ")
    				print("1 dm3 ",de(self.m),"a une masse de",self.densite,"kg ou")
    				print("1 m3 = 10**3 dm3 ",de(self.m),"a une masse de",self.densite,"x 10**3 kg =",self.densite,"t") 
    				print("La masse de",self.V/10**9,"m3 ",de(self.m),"est égale à",self.densite,"x",self.V/10**9,"t =",self.densite*self.V/10**9,"t")
    				print("La masse de 1 m2 de cette feuille est égale à :",self.densite*self.V/10**9,"t/",self.V/((10**6)*self.e),"m2 =",self.densite*self.e/1000,"t =",self.densite*self.e,"kg")   
    				print(' ')
    				print(' ')
    				print("Solution utilisant le volume et la surface")
    				print("Le volume d’un cube est c × c × c = c**3 ; il faut convertir toutes les mesures dans la même unité,")
    				print("il est plus simple de convertir",self.k*self.e,"cm en mm, donc,",self.k*self.e,"cm = 10 x",self.k*self.e,"=",10*self.k*self.e,"mm donc,")
    				print("le volume du cube est égal à",10*self.k*self.e,"x",10*self.k*self.e,"x",10*self.k*self.e,"=",self.V,"mm3 =",self.V/10**3,"cm3 =",self.V/10**6,"dm3 =",self.V/10**9,"m3")
    				print("La feuille a le même volume que le cube donc,")
    				print("S = V/e =",self.V,"/",self.e,"=",self.V/self.e,"mm2 =",self.V/(100*self.e),"cm2 =",self.V/((10**4)*self.e),"dm2 =",self.V/((10**6)*self.e),"m2")
    				print(' ')
    				print(' ')
    				print(' ')
     
     
    cube = CubeMetallique.create_randomly()
     
    fenetre = Tk()
    canvas = Canvas(fenetre, width=100, height=20, background='white')
    canvas.pack(side =TOP, padx =5, pady =5)
    bouton1 = Button(fenetre, text ='cube', command = cube.print_enonce_cube)
    bouton1.pack(side =TOP, padx =10, pady =10)
    bouton3 = Button(fenetre, text ='réponse_cube', command = cube.reponse_cube)
    bouton3.pack(side =RIGHT, padx =10, pady =10)
    fenetre.mainloop()
    Bonjour lg_53,

    Un très grand merci pour le temps que vous avez passé à corriger et à améliorer cet exercice.
    J'essaierai de l'utiliser pour améliorer mes autres exercices qui sont un peu analogues à celui-ci.
    Néanmoins, comme vous pouvez vous en douter, les techniques que vous utilisez dépassent très largement mes compétences même si je vois bien qu'il va me falloir apprendre les rudiments de la notion de classe (ce sera pour les grandes vacances, 2 mois ...).

    Une dernière question : avec le code que j'avais écrit, à chaque fois que j'appuyais sur le bouton "cube", j'obtenais un nouvel énoncé.
    Avec le code que vous avez écrit, j'obtiens toujours le même et pour en changer, il faut que je "débogue". Pourriez-vous m'expliquer pourquoi ?

    Merci pour votre réponse.
    Bien cordialement.
    Pierre

  10. #10
    Membre Expert

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Par défaut
    Là ca fonctionnait en fermant la fenêtre tkinter et en relançant (ça fournissait qqch de différent).

    J'ai ajouté une fonction permettant l'update de l'objet qui fera très bien l'affaire

    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
    89
    90
    91
    92
    #!/usr/bin/python
    from tkinter import *
    import random
    from tkinter.messagebox import *
     
    def du(nom):
        if nom[0] in 'aeiouy' : 
            #### exemple : de l'or
            return "de l'"+nom
        else :
            #### exemple : du cuivre
            return "du "+nom
     
    def de(nom):
        if nom[0] in 'aeiouy' : 
            #### exemple : d'or
            return "d'"+nom
        else :
            #### exemple : de cuivre
            return "de "+nom
     
     
    class CubeMetallique :
    		metaux={'fer':7.9,'plomb':11.4,'cuivre':9,'zinc':7.1,'platine':21.5,'nickel':8.3,"or":19.3,"aluminium":2.7,"argent":10.5,'étain':7.3}
     
    		def __init__(self,k,e,m):
    				print("init")
    				self.k=k
    				self.e=e
    				self.m=m
    				self.densite = self.metaux[self.m]
    				self.V=(10*self.k*self.e)**3
     
                    @classmethod
    		def create_randomly(cls):
    				k=random.choice(range(1,20)) 
    				e=random.choice(range(1,20)) 
    				m=random.choice(list(cls.metaux))
    				return cls(k,e,m)
     
    		def update_with_new_random_values(self):
    				self.k=random.choice(range(1,20)) 
    				self.e=random.choice(range(1,20)) 
    				self.m=random.choice(list(self.metaux))
    				self.densite = self.metaux[self.m]
    				self.V=(10*self.k*self.e)**3
     
    		def print_enonce_cube(self):			
    				print("Une masse cubique en",self.m,"a",self.k*self.e,"cm d’arête. On la transforme en une feuille de",self.e,"mm d’épaisseur.")
    				print("Quelle est la surface de cette feuille ?")
    				print("Quel est le poids (la masse) d'un mètre carré de cette feuille ?")
    				print(' ')   
     
    		def update_and_print(self):			
    				self.update_with_new_random_values()
    				self.print_enonce_cube()           
     
    		def reponse_cube(self):
    				print("On peut considérer le cube comme un pavé droit dont l'épaisseur serait égale à la longueur de l'arête")
    				print("Donc, l’épaisseur du cube est égale à",self.k*self.e,"cm =",10*self.k*self.e,"mmm.")
    				print("L’épaisseur de la feuille est",10*self.k*self.e,"/",self.e,"=",10*self.k,"fois plus petite donc, puisque le volume est constant,")
    				print("l’aire de la feuille est",10*self.k,"fois plus grande :")
    				print(10*self.k*self.e,'x',10*self.k*self.e,"×",10*self.k,"=",1000*self.k**3*self.e**2,"mm2 =",10*self.k**3*self.e**2,"cm2 =",self.k**3*self.e**2/10,"dm2 =",self.k**3*self.e**2/1000,"m2")
    				print(' ')
    				print("La densité",du(self.m),"est égale à", self.densite,"cela signifie que ")
    				print("1 dm3 ",de(self.m),"a une masse de",self.densite,"kg ou")
    				print("1 m3 = 10**3 dm3 ",de(self.m),"a une masse de",self.densite,"x 10**3 kg =",self.densite,"t") 
    				print("La masse de",self.V/10**9,"m3 ",de(self.m),"est égale à",self.densite,"x",self.V/10**9,"t =",self.densite*self.V/10**9,"t")
    				print("La masse de 1 m2 de cette feuille est égale à :",self.densite*self.V/10**9,"t/",self.V/((10**6)*self.e),"m2 =",self.densite*self.e/1000,"t =",self.densite*self.e,"kg")   
    				print(' ')
    				print(' ')
    				print("Solution utilisant le volume et la surface")
    				print("Le volume d’un cube est c × c × c = c**3 ; il faut convertir toutes les mesures dans la même unité,")
    				print("il est plus simple de convertir",self.k*self.e,"cm en mm, donc,",self.k*self.e,"cm = 10 x",self.k*self.e,"=",10*self.k*self.e,"mm donc,")
    				print("le volume du cube est égal à",10*self.k*self.e,"x",10*self.k*self.e,"x",10*self.k*self.e,"=",self.V,"mm3 =",self.V/10**3,"cm3 =",self.V/10**6,"dm3 =",self.V/10**9,"m3")
    				print("La feuille a le même volume que le cube donc,")
    				print("S = V/e =",self.V,"/",self.e,"=",self.V/self.e,"mm2 =",self.V/(100*self.e),"cm2 =",self.V/((10**4)*self.e),"dm2 =",self.V/((10**6)*self.e),"m2")
    				print(' ')
    				print(' ')
    				print(' ')
     
     
    cube = CubeMetallique.create_randomly()
     
    fenetre = Tk()
    canvas = Canvas(fenetre, width=100, height=20, background='white')
    canvas.pack(side =TOP, padx =5, pady =5)
    bouton1 = Button(fenetre, text ='cube', command = cube.update_and_print)
    bouton1.pack(side =TOP, padx =10, pady =10)
    bouton3 = Button(fenetre, text ='réponse_cube', command = cube.reponse_cube)
    bouton3.pack(side =RIGHT, padx =10, pady =10)
    fenetre.mainloop()
    Pour la programmation objet, oui c'est une bonne idée de vouloir l'apprendre. Pour l'instant, retiens juste que tout ce qui est du genre "self." désigne un attribut (une variable) de l'objet lui même. Donc dans notre cas ici, ca revient à faire des variables globales (il y a bien d'autres avantages bien sûr à la programmation objet que je passe sous silence) au sein d'un espace clos que l'on controle (la classe). Les méthodes (les fonctions) contenues dans la classe peuvent ainsi facilement partager des variables.

  11. #11
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2014
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2014
    Messages : 35
    Par défaut
    Bonsoir fred 1599,

    Merci pour tous vos conseils même si je n'ai pas encore tout compris mais, je vais m'y mettre sérieusement.
    Le code "répétitif" c'était pour dire un exercice que l'élève peut faire seul (boutons énoncé/réponse) et refaire à volonté (!) (random).

    Bonne soirée à vous et encore merci.
    Pierre

  12. #12
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2014
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2014
    Messages : 35
    Par défaut
    Bonsoir lg_53,

    Merci beaucoup pour ce code complet qui fonctionne très bien. Il ne me reste plus qu'à l'étudier et à le comprendre afin de pouvoir l'utiliser pour mes autres exercices.

    Bonne soirée à vous et encore merci.
    Pierre

  13. #13
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 078
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 078
    Par défaut
    Le code "répétitif" c'était pour dire un exercice que l'élève peut faire seul (boutons énoncé/réponse) et refaire à volonté (!) (random).
    Oui, mais le rapport avec global ?

    À chaque appui sur un bouton, un événement est déclenché par le biais d'un callback via son paramètre command, c'est lui qui permettra d'exécuter répétitivement une action.

  14. #14
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2014
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2014
    Messages : 35
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    Oui, mais le rapport avec global ?

    À chaque appui sur un bouton, un événement est déclenché par le biais d'un callback via son paramètre command, c'est lui qui permettra d'exécuter répétitivement une action.
    Bonsoir,

    L'utilisation de global permet, avec des connaissances très rudimentaires (sans utiliser de classe), d'avoir la même valeur pour l'énoncé et la réponse et cela fonctionne très bien même si j'ai bien compris que ce n'est pas la méthode recommandée et dans la mesure où j'écris des programmes extrêmement courts (< 20 lignes), il n'y a aucun "risque".
    Par contre, je pense pouvoir utiliser le petit code que vous m'avez écrit pour distinguer du/de pour choisir de façon aléatoire le signe d'un nombre.
    Néanmoins, je viens de réécrire un exercice en utilisant le code de lg_53 en faisant un copier-coller et je vais continuer.

    Bonne soirée.
    Pierre

  15. #15
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 078
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 078
    Par défaut
    dans la mesure où j'écris des programmes extrêmement courts (< 20 lignes), il n'y a aucun "risque".
    Quel risque? le seul risque que comporte le mot clé global, c'est d'ajouter une grosse probabilité d'erreurs quand à la conception de votre programme.

    Maintenant global pour un expérimenté n'est pas interdit (même si on évite), il sait ce qu'il fait ! Par contre un débutant, c'est à tout les coups une erreur...

    L'utilisation de global permet, avec des connaissances très rudimentaires (sans utiliser de classe), d'avoir la même valeur pour l'énoncé et la réponse et cela fonctionne très bien
    Sur un petit code très simple, peux-tu démontrer cela? À mon tour je te prouverai le contraire, après je te laisse tranquille

    Néanmoins, je viens de réécrire un exercice en utilisant le code de lg_53 en faisant un copier-coller et je vais continuer.
    Le code de lg_53 vaut ce qu'il vaut, je ne critique pas ceux qui aide, je ne l'ai pas lu (pas entièrement), mais tu dis qu'il utilise la notion de classe, que tu n'as pas encore étudié me semble-t-il... À mon humble avis, la notion de fonctions et un code principal bien construit devrait suffire à lui même pour ce travail et cela sans l'utilisation du mot clé global. Cependant je suis content qu'une personne est pu exprimer ton besoin sous forme de code et te faire avancer, profites-en !

    Note: Je remarque l'utilisation de classmethod, là on commence à utiliser le bazookas pour tuer une mouche Conceptuellement il y a sans doute une explication de sa part...

  16. #16
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2014
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2014
    Messages : 35
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    Quel risque? le seul risque que comporte le mot clé global, c'est d'ajouter une grosse probabilité d'erreurs quand à la conception de votre programme.

    Maintenant global pour un expérimenté n'est pas interdit (même si on évite), il sait ce qu'il fait ! Par contre un débutant, c'est à tout les coups une erreur...



    Sur un petit code très simple, peux-tu démontrer cela? À mon tour je te prouverai le contraire, après je te laisse tranquille



    Le code de lg_53 vaut ce qu'il vaut, je ne critique pas ceux qui aide, je ne l'ai pas lu (pas entièrement), mais tu dis qu'il utilise la notion de classe, que tu n'as pas encore étudié me semble-t-il... À mon humble avis, la notion de fonctions et un code principal bien construit devrait suffire à lui même pour ce travail et cela sans l'utilisation du mot clé global. Cependant je suis content qu'une personne est pu exprimer ton besoin sous forme de code et te faire avancer, profites-en !

    Note: Je remarque l'utilisation de classmethod, là on commence à utiliser le bazookas pour tuer une mouche Conceptuellement il y a sans doute une explication de sa part...
    Bonsoir,

    Je vous envoie un petit exercice pour vous montrer (et non pas justifier) que l'emploi de global n'est si dramatique...4 Règle des signes.py

    Bonne soirée.
    Pierre

  17. #17
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 078
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 078
    Par défaut
    Si je retire tout le blabla de votre code (tu aurais pu le faire), voilà ce que ça donne

    Citation Envoyé par pir2Paris
    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
    from tkinter import *
    import random
    import math
    import time
    from tkinter.messagebox import *
     
    def règle_des_signes():
        global a
        a = random.randint(1,100) # modification 
        global b
        b = random.randint(1,100) # modification 
        print("Quel est le signe d'un produit de facteurs comportant",a,"facteurs positfs et",b,"facteurs négatifs ?")
     
    def réponse_règle_des_signes():
        global a
        a 
        global b
        b 
        if b%2==0:
            print("POSITIF car il comporte un nombre PAIR (",b,") de facteurs négatifs")
            print(' ')
            print(' ')
        else:
            print("NEGATIF car il comporte un nombre IMPAIR (",b,") de facteurs négatifs")
            print(' ')
            print(' ')
     
    def aide():
        print("Si un produit comprend un nombre pair de facteurs négatifs alors, ce produit de facteurs est positif")
        print("Si un produit comprend un nombre impair de facteurs négatifs alors, ce produit de facteurs est négatif")
        print("Le nombre de facteurs positifs n'a aucune incidence sur le signe d'un produit.")
     
    fenetre = Tk()
    canvas = Canvas(fenetre, width=100, height=20, background='white')
    canvas.pack(side =TOP, padx =5, pady =5)
    bouton1 = Button(fenetre, text ='règle des signes', command = règle_des_signes)
    bouton1.pack(side =TOP, padx =10, pady =10)
    bouton2 = Button(fenetre, text ='réponse_règle des signes', command = réponse_règle_des_signes)
    bouton2.pack(side =TOP, padx =10, pady =10)
    bouton7= Button (fenetre, text="aide",width=10, command=aide)
    bouton7.pack(side =TOP, padx =10, pady =10)
    fenetre.mainloop()
    En virant les mots clé global, voilà ce que ça donne

    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
    from tkinter import *
    import random
    import math
    import time
    from tkinter.messagebox import *
     
    def règle_des_signes():
        a.set(random.randint(1,100)) 
        b.set(random.randint(1,100))
        print("Quel est le signe d'un produit de facteurs comportant", a.get(), \
              "facteurs positfs et", b.get(), "facteurs négatifs ?")
     
    def réponse_règle_des_signes():
        x = b.get()
        if x % 2 == 0:
            print("POSITIF car il comporte un nombre PAIR (", x, ") de facteurs négatifs")
            print(' ')
            print(' ')
        else:
            print("NEGATIF car il comporte un nombre IMPAIR (", x, ") de facteurs négatifs")
            print(' ')
            print(' ')
     
    def aide():
        print("Si un produit comprend un nombre pair de facteurs négatifs alors, ce produit de facteurs est positif")
        print("Si un produit comprend un nombre impair de facteurs négatifs alors, ce produit de facteurs est négatif")
        print("Le nombre de facteurs positifs n'a aucune incidence sur le signe d'un produit.")
     
    fenetre = Tk()
    a, b = IntVar(), IntVar()
    canvas = Canvas(fenetre, width=100, height=20, background='white')
    canvas.pack(side =TOP, padx =5, pady =5)
    bouton1 = Button(fenetre, text ='règle des signes', command = règle_des_signes)
    bouton1.pack(side =TOP, padx =10, pady =10)
    bouton2 = Button(fenetre, text ='réponse_règle des signes', command = réponse_règle_des_signes)
    bouton2.pack(side =TOP, padx =10, pady =10)
    bouton7= Button (fenetre, text="aide",width=10, command=aide)
    bouton7.pack(side =TOP, padx =10, pady =10)
    fenetre.mainloop()
    Il y a plein d'autres manières de faire, via les objets list, dict, ...

    Et puis niveau conception, on peut faire beaucoup mieux, mais j'avoue qu'il est rare de faire un mix console/IHM si ce n'est pour le test.

  18. #18
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2014
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2014
    Messages : 35
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    Si je retire tout le blabla de votre code (tu aurais pu le faire), voilà ce que ça donne



    En virant les mots clé global, voilà ce que ça donne

    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
    from tkinter import *
    import random
    import math
    import time
    from tkinter.messagebox import *
     
    def règle_des_signes():
        a.set(random.randint(1,100)) 
        b.set(random.randint(1,100))
        print("Quel est le signe d'un produit de facteurs comportant", a.get(), \
              "facteurs positfs et", b.get(), "facteurs négatifs ?")
     
    def réponse_règle_des_signes():
        x = b.get()
        if x % 2 == 0:
            print("POSITIF car il comporte un nombre PAIR (", x, ") de facteurs négatifs")
            print(' ')
            print(' ')
        else:
            print("NEGATIF car il comporte un nombre IMPAIR (", x, ") de facteurs négatifs")
            print(' ')
            print(' ')
     
    def aide():
        print("Si un produit comprend un nombre pair de facteurs négatifs alors, ce produit de facteurs est positif")
        print("Si un produit comprend un nombre impair de facteurs négatifs alors, ce produit de facteurs est négatif")
        print("Le nombre de facteurs positifs n'a aucune incidence sur le signe d'un produit.")
     
    fenetre = Tk()
    a, b = IntVar(), IntVar()
    canvas = Canvas(fenetre, width=100, height=20, background='white')
    canvas.pack(side =TOP, padx =5, pady =5)
    bouton1 = Button(fenetre, text ='règle des signes', command = règle_des_signes)
    bouton1.pack(side =TOP, padx =10, pady =10)
    bouton2 = Button(fenetre, text ='réponse_règle des signes', command = réponse_règle_des_signes)
    bouton2.pack(side =TOP, padx =10, pady =10)
    bouton7= Button (fenetre, text="aide",width=10, command=aide)
    bouton7.pack(side =TOP, padx =10, pady =10)
    fenetre.mainloop()
    Il y a plein d'autres manières de faire, via les objets list, dict, ...

    Et puis niveau conception, on peut faire beaucoup mieux, mais j'avoue qu'il est rare de faire un mix console/IHM si ce n'est pour le test.
    Bonsoir,

    Je ne doute pas qu'il existe d'autres façons plus "correctes" d'écrire ce code mais elles nécessitent d'utiliser une classe ou les méthodes .set et .get que je ne connais pas encore.
    Disons que cette façon "incorrecte" mais simple est une étape transitoire.

    Bonne soirée.
    Pierre

  19. #19
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 078
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 078
    Par défaut
    Tu acceptes bien les décorateurs (@classmethod) qui sont des notions avancées (certes sucre syntaxique)

    Le dictionnaire que j’utilise (ci-dessous) te remontera le moral, c'est assez simple à comprendre

    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
    from tkinter import *
    import random
     
    def règle_des_signes():
        values['a'] = a = random.randint(1, 100)
        values['b'] = b = random.randint(1, 100)
        print("Quel est le signe d'un produit de facteurs comportant", a, \
              "facteurs positfs et", b, "facteurs négatifs ?")
     
    def réponse_règle_des_signes():
        b = values['b']
        if b % 2 == 0:
            print("POSITIF car il comporte un nombre PAIR (", b, ") de facteurs négatifs")
            print(' ')
            print(' ')
        else:
            print("NEGATIF car il comporte un nombre IMPAIR (", b, ") de facteurs négatifs")
            print(' ')
            print(' ')
     
    def aide():
        print("Si un produit comprend un nombre pair de facteurs négatifs alors, ce produit de facteurs est positif")
        print("Si un produit comprend un nombre impair de facteurs négatifs alors, ce produit de facteurs est négatif")
        print("Le nombre de facteurs positifs n'a aucune incidence sur le signe d'un produit.")
     
    fenetre = Tk()
    values = {'a': 0, 'b': 0}
    canvas = Canvas(fenetre, width=100, height=20, background='white')
    canvas.pack(side =TOP, padx =5, pady =5)
    bouton1 = Button(fenetre, text ='règle des signes', command = règle_des_signes)
    bouton1.pack(side =TOP, padx =10, pady =10)
    bouton2 = Button(fenetre, text ='réponse_règle des signes', command = réponse_règle_des_signes)
    bouton2.pack(side =TOP, padx =10, pady =10)
    bouton7= Button (fenetre, text="aide",width=10, command=aide)
    bouton7.pack(side =TOP, padx =10, pady =10)
    fenetre.mainloop()
    values représentent les valeurs des variables a et b. Lorsqu'on veut modifier leur valeur, on fait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    values['a'] = ma_valeur
    et si on souhaite là récupérer,

    Le dictionnaire est une notion de base dans l'apprentissage du langage, elle passe bien avant de comprendre les notions de bases de la POO comme les classes, mais rien n'empêche des les apprendre parallèlement.

    Après l'exemple est là pour te montrer que plusieurs manières existent, les classes en font parties... Les questions que je me poserai pour la suite dans cet exercice, c'est comment éviter les redondances d'affichage comme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    print("Si un produit comprend un nombre pair de facteurs négatifs alors, ce produit de facteurs est positif")
    print("Si un produit comprend un nombre impair de facteurs négatifs alors, ce produit de facteurs est négatif")
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    print("POSITIF car il comporte un nombre PAIR (", b, ") de facteurs négatifs")
    print("NEGATIF car il comporte un nombre IMPAIR (", b, ") de facteurs négatifs")
    ou comment avec une boucle for je peux créer de multiples boutons ayant les mêmes caractéristiques au niveau de leur placement géométrique

    Bon comme promis, je te laisse tranquille à moins que tu souhaites encore des renseignements, dans ce cas n'hésites pas !

  20. #20
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 762
    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 762
    Par défaut
    Citation Envoyé par pir2Paris Voir le message
    Disons que cette façon "incorrecte" mais simple est une étape transitoire.
    Il n'y a rien d'incorrect à utiliser le mot-clef "global" pour assigner de nouvelles valeurs/objets à ces variables ou accéder à des variables globales associées des objets que l'on modifie (Intvar, dictionnaires, listes,...).

    Cela pose juste des soucis dans la compréhension (et la maintenance) de gros programmes où l'état du programme à l'instant t, dépendra de ce tas de variables.
    Au plus, il y en a et au plus, des fonctions en dépendent et au plus , les "bugs" seront difficiles à comprendre et corriger.

    Pour des questions d'hygiène, on va plutôt s'attacher à écrire des fonctions "pures" (qui n'accèdent qu'à leurs arguments en lecture et retournent de nouveaux objets) et des "class", pour partitionner le programme en entités qui auront un rôle et des responsabilités bien définies. Plus faciles à appréhender, coder et tester sera plus simple et plus sûr.

    Dans votre cas, vous n'avez que 3/4 variables partagées entre deux fonctions: pas de quoi se prendre le chou même si apprendre la POO reste incontournable pour ceux qui veulent progresser en programmation. Mais la POO va bien au delà de la création d'une "class"!!!

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

Discussions similaires

  1. Un fichier dictionnaire ?
    Par portu dans le forum Windows
    Réponses: 6
    Dernier message: 17/04/2007, 15h26
  2. Script assez difficile avec random
    Par LFC dans le forum Requêtes
    Réponses: 6
    Dernier message: 01/08/2003, 18h02
  3. [langage] random sur liste ou tableau
    Par martijan dans le forum Langage
    Réponses: 2
    Dernier message: 15/07/2003, 14h47
  4. [VB6] : pour faire un Randomize sous vb... merci
    Par delnic dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 22/01/2003, 15h49
  5. Random en Assembleur
    Par funx dans le forum Assembleur
    Réponses: 9
    Dernier message: 02/09/2002, 17h05

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