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 :

Exercice - Générer un mot au hasard


Sujet :

Python

  1. #21
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par Kurodiam Voir le message
    C'est pas pour me répéter , mais dans l'émission des chiffres et des lettres , lorsque les participants du jeu ne trouvent pas le mot à 9 lettres (le mot le plus long) ou d'autres longueurs de mots , c'est bien un programme ou une sorte d'application qui est capable de générer ce mot en fonction des consones et voyelles choisies par les participants .Donc il faudrait aller faire un tour du coté de cet application magique .
    Quel est le rapport avec le sujet posté par le PO?

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

  2. #22
    Membre expérimenté Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Points : 1 481
    Points
    1 481
    Par défaut
    Citation Envoyé par Julien N Voir le message
    ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    from random import randint
    
    def MotAuHasard(n):
        # vérifier que 2<n<10.
        if not n in range(2,11):
            return "Erreur, parametre n doit etre entre 2 et 10"
        # construire mot composé de n lettres entre 'a' et 'z'    
        return ''.join([chr(randint(97,123)) for i in range(n)])
    En "régime de croisière", la fonction retourne une chaine. Quand il y a un hic, pourquoi, aussi, retourner une chaine ? J'imagine le code de l'appelant qui doit gérer ça... (beurk)

    Personnellement, je lèverais une exception.
    "La simplicité ne précède pas la complexité, elle la suit." - Alan J. Perlis
    DVP ? Pensez aux cours et tutos, ainsi qu'à la FAQ !

  3. #23
    Membre actif Avatar de Kurodiam
    Inscrit en
    Décembre 2013
    Messages
    208
    Détails du profil
    Informations forums :
    Inscription : Décembre 2013
    Messages : 208
    Points : 215
    Points
    215
    Par défaut
    Toi , tu passes ton temps à dire beurk , faut pas terroriser le débutant @zied131 comme même (moi-même , vu mon niveau , je n'arrivais pas encore à inventer un code pareil).

    Euh @wiztricks , je peux pas être plus explicite que ce que j'ai dit , sérieux , je faisais juste une sorte de parallèle : les jeux à la télé sont un exemple de programmation ...
    _""""Cats have a big heart ^^ unlike some bad people (whose will never change in their brain) """

  4. #24
    Membre éprouvé

    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    654
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Août 2010
    Messages : 654
    Points : 1 150
    Points
    1 150
    Par défaut
    Citation Envoyé par plxpy Voir le message
    Personnellement, je lèverais une exception.
    C'est très juste. Si cette fonction doit être plus qu'un exemple pédagogique, il faut mieux lever une exception. J'en profite pour demander comment gérer celle-ci. Je n'ai pas lu assez de code pour savoir quelle est la bonne pratique dans ce genre de cas.

    Par exemple, entre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    assert n in range(2,11)
    et,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if not n in range(2,11):
            raise Exception('Erreur, parametre n doit etre entre 2 et 10')
    ou plus spécifique,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if not n in range(2,11):
            raise ValueError('Erreur, parametre n doit etre entre 2 et 10')
    ou encore le classique try/except:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    try:
         ...
    except:
         raise ValueError('Erreur, parametre n doit etre entre 2 et 10')
    else:
         ...
    Et bien d'autres, je ne sais jamais quelle est la "bonne" façon de faire.


    J

  5. #25
    Membre expérimenté Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Points : 1 481
    Points
    1 481
    Par défaut
    Le "beurk" était lié au code de l'appelant. Avec ta solution, la fonction se déroule toujours bien : elle retourne une chaine dans tous les cas.

    C'est seulement en analysant le retour (la chaine) que l'appelant sait de quoi il retourne : erreur ? pas erreur ?

    Donc, ça part sur de le comparaison de chaines. Ou de longueurs de chaines . Un "connard !" comme retour fait 9 caractères. Pas moyen de se baser sur la longueur de la chaine (un vrai mot peut avoir 10 caractères).

    Après il y a un ' ' et un '!'. Il ne sont pas dans les "range" de caractères, certes mais .. c'est lourd (pour l'appelant)

    D'où "ma" solution.

    Je n'ai pas regardé en détail tes solutions, mais, je suis d'accord avec toi : comment faire au mieux ? Je n'ai, malheureusement, pas LA réponse. Mais je regarde toutes tes propositions "tranquillement".

    [EDIT] des fois, j'ai du mal à me faire comprendre. Mais je regarde, activement, tes solutions, promis.
    "La simplicité ne précède pas la complexité, elle la suit." - Alan J. Perlis
    DVP ? Pensez aux cours et tutos, ainsi qu'à la FAQ !

  6. #26
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    L'important est que l'appelant sache de façon sûre que la fonction appelée a fait le boulot attendu.

    On pourrait écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    def MotAuHasard(n):
        # vérifier que 2<n<10.
        if 2 < n <= 10:
            mot = [ choice(string.ascii_lowercase) for _ in range (n) ]
            return ''.join(mot)
    dans ce cas la fonction retournera None si l'entier n'est pas dans ]2..10]

    Problème: l'appelant oublie de tester la valeur de retour. Si le programme se vautre un peu plus loin, remonter à la cause sera plus compliqué... Et si en plus, cela provoque la corruption d'une base de donnée, il va falloir aussi restaurer un backup... Galère!

    Avec une exception, l'appelé force le plantage du programme avec un message d'erreur explicite.
    Mais dans la pratique, c'est ne pas trop faire confiance à l'appelant pour "tester" et l'obliger à écrire un try...except... s'il veut passer outre.
    C'est comme le forcer à signer une décharge.

    Intuitivement, cette parano est compréhensible lorsqu'on écrit une bibliothèque.
    Dans ce cas, blinder les interfaces pour tester la validité des paramètres passés et remonter des exceptions "claires".
    Ce sera un "plus" qui aidera l'utilisateur de la bibliothèque à planter assez tôt pour pouvoir corriger son code.

    Pour les fonctions que vous écrivez vous, c'est plus délicat.
    Car il y a des endroits ou vous serez en confiance, d'autres moins.
    De plus pour mettre le code au point, vous pourrez le tourner sous un deboggeur symbolique, ajouter des log.debug(...), écrire des tests unitaires,...
    Vous n'êtes plus sous la contrainte "interface utilisateur" mais sous celle d'avoir à faire fonctionner votre code assez vite.
    Il faudra prendre le chemin le plus adapté selon la confiance que vous avez en vous, dans la connaissance des bibliothèques que utilisées,...
    De toutes façons, avec l'expérience, le bon choix va s'imposer tout seul.
    Mais c'est pas binaire!

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

Discussions similaires

  1. Réponses: 10
    Dernier message: 04/12/2007, 08h34
  2. Générer un mot de passe
    Par yann_72 dans le forum WinDev
    Réponses: 7
    Dernier message: 15/11/2007, 18h44
  3. Comment générer un mot de passe composé de lettre et chiffre ?
    Par Ekimasu dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 25/05/2007, 16h09
  4. [Tableaux] Afficher un mot au hasard parmi une liste
    Par Chipsssit dans le forum Langage
    Réponses: 7
    Dernier message: 19/05/2007, 14h05
  5. générer des caracteres au hasard
    Par Yepazix dans le forum Langage
    Réponses: 5
    Dernier message: 11/04/2006, 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