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 :

[Debutant] Problème avec l'instruction "break"


Sujet :

Python

  1. #1
    Membre à l'essai
    Profil pro
    Client Solution Developer
    Inscrit en
    Janvier 2011
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Client Solution Developer

    Informations forums :
    Inscription : Janvier 2011
    Messages : 23
    Points : 21
    Points
    21
    Par défaut [Debutant] Problème avec l'instruction "break"
    Bonjour à tous,

    dans un script que j'ai écrit, je suis suis surpris par l'endroit où me renvoit l'instruction break. Je m'explique:
    le break récalcitrant se trouve à la ligne 32. Lorsqu'il est parcouru, je m'attends à ce que la fonction consult() prenne fin et que le programme se termine alors. Or il reprend à la ligne 43.

    J'ai placé des "balises" dans mon script pour tenter de vous expliquer plus clairement. Pour résumer, une fois que les fonctions ont été lues par le programme et qu'on se retrouve à Endroit 1, le programme termine la fonction et passe par Endroit 2 (ce qui est normal). Mais au lieu de se terminer, il "saute" à Endroit 4, ce que je m'explique pas.

    Ma version de Python est la 2.6.6 et voici mon script:

    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
    # -*- coding: cp1252 -*-
    #Programme qui demande à l'utilisateur d'entrer des données ou de le consulter
     
    def rempl():
        #Complète un dictionnaire contentant "nom" (comme clé),
        #"age" et "taille" (comme valeurs)".
        while 1:
            nom = raw_input('Entrez votre nom : ').capitalize()
            age = int(raw_input('Quel est votre âge? '))
            taille = float(raw_input('Quelle est votre taille (en m)? '))
            dico[nom] = (age, taille)    #"age" et "taille" forment un tuple
            rep=raw_input('\nPour encoder un autre utilisateur, appuyez sur "e", \n\
    pour consulter les données, appuyez sur "c",\n pour quitter, appuyez sur "q" : ')
            if rep=='c':
                consult()
            if rep=='q':
                break        
     
    def consult():
        #Consulte les données dans le dictionnaire;
        #il est demandé à l'utilisateur d'entrer un nom.
        nom = raw_input('Veuillez entrer le nom d\'une personne : ').capitalize()
        while 1:
            tupl = dico.get(nom,0)  #Extrait les variables "age" et "taille"
                                    #en tant que tuple
            if tupl==0:     #Ce qui se passe si le nom n'a pas été trouvé
                            #dans le dictionnaire
                nom = raw_input('Nom introuvable. Veuillez entrer un autre nom ou \
    appuyez sur <Entrée> pour quitter : ').capitalize()
                if nom=='':
                    #print 'Endroit 1'   #Balise pour expliquer mon problème
                    break   #Voici le "break" récalcitrant
            else:           #Ce qui se passe si le nom a été trouvé
                age = tupl[0]
                taille = tupl[1]
                print 'Nom: %s - Âge: %s ans - Taille: %s m.' % (nom,age,taille)
                ini()       
        #print 'Endroit 2'   #Balise pour expliquer mon problème
     
    def ini():
        #Propose à l'utilsateur d'encoder des données,de les consulter ou de quitter
        #print 'Endroit 3'   #Balise pour expliquer mon problème
        while 1:
            #print 'Endroit 4'
            choix = raw_input('\nPour encoder des renseignements, appuez sur "e";\n\
    Pour consulter des données, apuuyez sur "c";\n\
    Pour quitter, appuyer n\'importe quelle autre touche : ')
            if choix=='e':
                rempl()
            elif choix=='c':
                consult()
            else:
                break
     
    #Corps principal
    dico={}     #Création d'un dictionnaire
    ini()
    Je vous remercie d'avance pour l'aide apportée!

    Ps: j'ai écrit ce script d'après un exercice (le 10.45) du tutoriel écrit par G. Swinnen.

  2. #2
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    break permet seulement de sortir de la boucle dans laquelle il se trouve, ici while. C'est la manière courante de sortir d'une boucle sans fin 'while True' pour exécuter la suite du code. Mais ça ne permet pas une sortie anticipée de la fonction.

    Pour une sortie anticipée de la fonction, c'est return.

    Tyrtamos
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  3. #3
    Membre à l'essai
    Profil pro
    Client Solution Developer
    Inscrit en
    Janvier 2011
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Client Solution Developer

    Informations forums :
    Inscription : Janvier 2011
    Messages : 23
    Points : 21
    Points
    21
    Par défaut
    Tout d'abord merci pour ta réponse.

    Je suis bien d'accord avec toi. Mais dans ce cas, l'instruction while étant la dernière de ma fonction consult(), break me fait quitter tout le bloc while et donc aussi ma fonction consult().

    Il ne devrait rien se passer ensuite (car la ligne qui suit définit une autre fonction (ini())). Cependant, le code continue à être lu (précisément à Endroit 3), ce que je ne m'explique pas.

    Ps: j'ai bien remplacé break par return, mais je n'observe aucun différence!

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 159
    Points : 224
    Points
    224
    Par défaut
    Salut,

    Le fonctionnement de ton programme me semble parfaitement attendu lorsqu'on regarde la pile d'appel.

    Ta fonction consult() est appelé dans ta fonction ini() au sein d'une boucle while.
    Lorsque tu "break", tu sors bien de ta fonction consult(). Et donc tu recommences un nouveau tour au sein de ta fonction ini().

    Si tu veux que la fonction ini() se termine lorsque la consultation a réussi, il faut placer un break ou un return à cet endroit là également.

  5. #5
    Membre à l'essai
    Profil pro
    Client Solution Developer
    Inscrit en
    Janvier 2011
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Client Solution Developer

    Informations forums :
    Inscription : Janvier 2011
    Messages : 23
    Points : 21
    Points
    21
    Par défaut
    ValAa,

    je n'avais pas du tout "regardé" mon script comme il le fallait! Merci beaucoup de ton aide et bonne journée!

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

Discussions similaires

  1. Formulaires : problème avec les slashes et les quotes
    Par GarGamel55 dans le forum Langage
    Réponses: 1
    Dernier message: 12/10/2005, 15h59
  2. [debutant] problème avec type à utiliser
    Par mlequim dans le forum Autres SGBD
    Réponses: 2
    Dernier message: 15/07/2005, 16h08
  3. Problème avec une instruction OUTER /Postgres
    Par Volcomix dans le forum Langage SQL
    Réponses: 14
    Dernier message: 21/04/2004, 16h56

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