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. #21
    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
    Citation Envoyé par fred1599 Voir le message
    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...
    Lol je voulais mettre aussi les attributs densite et V en @property mais je me suis retenu. Heureusement sinon t'aurais parler non pas de bazookas mais de tête nucléaire

    Plus sérieusement, c'est en effet un choix de conception ce classmethod. Ca permet de garder un constructeur non random : on peut initialiser la classe avec des valeurs données (que l'utilisateur aurait choisi par exemple) comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cube = CubeMetallique(5,1,"cuivre")
    et on peut aussi appelé la classmethod pour construire l'objet en random. On peut s'en passer mais sinon :

    1) soit on fait un constructeur qui randomise directement le truc (on perd donc la fonctionalité qui est de pouvoir créer un cube métallique avec des valeurs que l'on choisi)

    2) soit pour créer un cube métallique random, on est obligé de chainer 2 méthodes du style remplacer (le constructeur + une autre méthode) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cube = CubeMetallique.create_randomly()
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cube = CubeMetallique().update_with_new_random_values()
    en admettant qu'on ait donné des valeurs par défaut au constructeur comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    def __init__(self,k=1,e=1,m='fer'):
    mais sémantiquement, on n'a pas vraiment de raison d'initialiser par défaut une instance sur un métal précis plutôt qu'un autre...

    @pir2Paris : Si tu veux comprendre un peu ici l'idée de ce que je racontes sans être familier avec les classes, tu auras besoin de savoir qu'écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cube = CubeMetallique(5,1,"cuivre")
    va appelé la fonction __init__ de la classe CubeMetallique

  2. #22
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 172
    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 172
    Par défaut
    Citation Envoyé par lg_53 Voir le message
    1) soit on fait un constructeur qui randomise directement le truc (on perd donc la fonctionalité qui est de pouvoir créer un cube métallique avec des valeurs que l'on choisi)

    2) soit pour créer un cube métallique random, on est obligé de chainer 2 méthodes du style remplacer (le constructeur + une autre méthode) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cube = CubeMetallique.create_randomly()
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cube = CubeMetallique().update_with_new_random_values()
    en admettant qu'on ait donné des valeurs par défaut au constructeur comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    def __init__(self,k=1,e=1,m='fer'):
    mais sémantiquement, on n'a pas vraiment de raison d'initialiser par défaut une instance sur un métal précis plutôt qu'un autre...
    Ne pourrait-on pas dans le constructeur juste informer du type de cube voulu ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    def __init__(self, ..., rand=True)
        if rand:
            self.create_randomly()
        else:
            # initialisation des valeurs choisies dans le constructeur
    Je dis ça mais peut-être n'ai-je pas compris ?

  3. #23
    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
    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
    Bonjour,

    Merci pour votre remarque, cela me rassure un peu car, à mon niveau (scripts de moins de 50 lignes) et pour ce que je souhaite faire, global me paraît plus facile à utiliser mais, je n'exclus pas, plus tard, d'apprendre et d'utiliser des méthodes plus complexes.

    Bonne journée à vous.
    Pierre

  4. #24
    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
    @lg_53

    Bonjour,

    Votre discussion très "technique" avec fred 1599 me conforte dans mon idée : mes petits exercices à 2 ou 3 variables ne nécessitent pas l'utilisation de telles connaissances.
    C'est parce que vous avez DEJA ces connaissances que vous les utilisez.
    Encore merci pour vos explications.

    Bonne journée.
    Pierre

  5. #25
    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
    @fred1599

    Bonjour,

    Pour le dictionnaire, je pense avoir compris et je vais essayer de faire les deux simplifications que vous me suggérez.
    Je vous remercie pour vos explications.

    Bonne journée.
    Pierre

  6. #26
    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
    Citation Envoyé par fred1599 Voir le message
    Ne pourrait-on pas dans le constructeur juste informer du type de cube voulu ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    def __init__(self, ..., rand=True)
        if rand:
            self.create_randomly()
        else:
            # initialisation des valeurs choisies dans le constructeur
    Je dis ça mais peut-être n'ai-je pas compris ?
    Oui on pourrait faire ça aussi. Mais dans ce cas on autorise l'utilsateur à écrire des choses comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cube = CubeMetallique(k=3, rand=True)
    et dans ce cas, la valeur 3 sera tout simplement ignorées puisque choisi random à cause de l'argument suivant. Pour être cohérent ceci dit on pourrait faire effectivement qqch de ressemblant à laquelle je n'avais pas pensé et qui est même mieux :

    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
    def __init__(self, k=None,e=None,m=None):
            if k is None : 
                  self.k=random.choice(range(1,20)) 
    	else : 
                  self.k=k
    	if e is None :
                 self.e = random.choice(range(1,20))
            else :
                 self.e=e
            if m is None :
                 self.m=random.choice(list(self.metaux))
    	else :
                 self.m=m
    	self.densite = self.metaux[self.m]
    	self.V=(10*self.k*self.e)**3
    @pir2Paris : Oui j'ai utilisé les classes car je les connais, mais effectivement on peut très bien faire sans et je ne dis pas le contraire. Ceci dit je rejoins les différents avis qui te disait que quelque soit la méthode utilisée, il vaut mieux éviter le mot clé "global" surtout quand on ne maîtrise pas la portée de ce qu'il implique. Vous vous mettez également une difficulté supplémentaire en voulant mélanger Tkinter et de l'affichage console. Vous pourriez très bien tout faire en console, ce qui est bien plus facile. Suffit juste de poser une (ou plusieurs) question à l'utilisateur pour remplacer le choix que l'utilisateur a à faire dans la fenetre tkinter, du style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    encore=True
    while encore :
        choix = input_raw("Que voulez vous faire? C : nouveau cube; R : afficher la réponse; Q : quitter le programme")
        if choix == C :
             cube()
        elif choix == R :
             reponse_cube()
        elif choix == Q :
             encore = False
        else :
             print("Vous avez saisi une option différente de C; R ou Q")
     
    print("--programme termine--")
    ce qui vous affranchi donc des contraintes Tkinter qui lui aussi fait appel à des notions que vous ne maitrisez pas (Get, Set, etc ...) et vous permettera ainsi d'écrire des fonctions plus propres, sans global, avec des arguments en entrée, et une valeur de sortie.

  7. #27
    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
    [QUOTE=fred1599;10188924]
    Bonsoir fred 1599,

    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")
    Comme promis, je vous envoie le code simplifié et non redondant 4E Règles des signes 3.py même si j'ai bien essayé de réunir les deux fonctions "positif" et "pair" en utilisant b pair mais ...

    Merci de votre aide.
    Bonne soirée.
    Pierre.

  8. #28
    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

    Vous pourriez très bien tout faire en console, ce qui est bien plus facile. Suffit juste de poser une (ou plusieurs) question à l'utilisateur pour remplacer le choix que l'utilisateur a à faire dans la fenetre tkinter, du style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    encore=True
    while encore :
        choix = input_raw("Que voulez vous faire? C : nouveau cube; R : afficher la réponse; Q : quitter le programme")
        if choix == C :
             cube()
        elif choix == R :
             reponse_cube()
        elif choix == Q :
             encore = False
        else :
             print("Vous avez saisi une option différente de C; R ou Q")
     
    print("--programme termine--")
    ce qui vous affranchi donc des contraintes Tkinter qui lui aussi fait appel à des notions que vous ne maitrisez pas (Get, Set, etc ...) et vous permettera ainsi d'écrire des fonctions plus propres, sans global, avec des arguments en entrée, et une valeur de sortie.
    Bonsoir lg_53,

    Je viens d'essayer votre code et malheureusement, il y a un message d'erreur : C n'est pas défini.
    Je vais chercher dans la documentation, j'ai déjà vu un bout de code similaire.

    Merci à vous.
    Bonne soirée.
    Pierre

  9. #29
    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
    Citation Envoyé par pir2Paris Voir le message
    Bonsoir lg_53,

    Je viens d'essayer votre code et malheureusement, il y a un message d'erreur : C n'est pas défini.
    Je vais chercher dans la documentation, j'ai déjà vu un bout de code similaire.

    Merci à vous.
    Bonne soirée.
    Pierre
    Autant pour moi, j'ai écris ca vite (trop) sans l'essayer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    encore=True
    while encore :
        choix = input("Que voulez vous faire? C : nouveau cube; R : afficher la réponse; Q : quitter le programme -> ")
        if choix == "C" :
             cube()
        elif choix == "R" :
             reponse_cube()
        elif choix == "Q" :
             encore = False
        else :
             print("Vous avez saisi une option différente de C; R ou Q")
     
    print("--programme termine--")
    C R et Q sont des chaines de caractères, et non des variables. input (et non pas raw_input qui ait pour le Python 2 d'ailleurs) renvoie ce que l'utilisateur a saisi au clavier sous la forme d'une chaine de caractère également.

  10. #30
    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
    [QUOTE=lg_53;10192144]


    Bonjour,

    Merci beaucoup pour votre réponse.

    Bonne journée.
    Pierre

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

    Citation Envoyé par pir2Paris Voir le message
    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")
    Il faut utiliser un formatage personnalisé de la chaîne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    message = (
        'Si un produit comprend un nombre {parité} de '
        'facteurs alors, ce produit de facteurs est {signe}'
        )
    print(message.format(parité="pair", signe='positif'))
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  12. #32
    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
    [QUOTE=wiztricks;10192798]


    Bonsoir,

    Je vous remercie pour votre réponse.

    Bonne soirée.
    Pierre

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