Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > fr.comp.lang.python > #3721

Re: Sortir d 'une boucle while

From Alain Ketterlin <alain@universite-de-strasbourg.fr.invalid>
Newsgroups fr.comp.lang.python
Subject Re: Sortir d 'une boucle while
Date 2022-01-31 09:27 +0100
Organization Université de Strasbourg
Message-ID <87a6fcpaxy.fsf@universite-de-strasbourg.fr.invalid> (permalink)
References <zM6dnZ5wDbXEsGr8nZ2dnUU7_8zNnZ2d@giganews.com>

Show all headers | View raw


Salut,

Comme l'a dit Benoît, le problème est le dernier "while" :

>     while choix in liste_choix:
>         if choix == 1 :
[...]

C'est trop tard pour faire une boucle : on a lu le choix (on ne le
relira pas dans cette boucle). Ce que tu veux tester c'est : est-ce un
choix valide ? Il faut faire cela avec "if", et seul le cas 3 garde son
"break" (qui permet maintenant de sortir du "while" le plus externe) :

    if choix == 1 :
        print("Choix 1, ajouter un élément")
        ajouter=input("Votre ajout ?")
        liste_elements.append(ajouter)
        ## break # plus approprié
    
    elif choix == 2 :
        print("Choix 2, Afficher la liste")
        print(liste_elements)
        ## break # plus approprié
   
    elif choix == 3:
        print("Choix 3 , Quitter") 
        break

    else:
        print("Mauvais choix , recommencez")

Note aussi que j'ai mis des "elif" (else if) : une fois qu'on a trouvé
la valeur du choix ce n'est pas la peine de tester les autres. Le test
de la validité du choix est devenu un cas de la cascade de if. Mais le
menu est réaffiché après un choix incorrect.

En reprenant l'ensemble, tu as deux boucles "while" qui doivent
tester la valeur du choix. Vu de loin, cela devrait être :

choix = -1
while choix != 3:

    ... afficher le menu ...
    choix = -1
    while choix not in liste_choix:
        ... lire la valeur de choix ...

    if choix == 1:
        ... action 1 ...
    elif choix == 2:
        ... action 2 ...
    elif choix == 3
        pass # rien du tout, mais sortira de la boucle externe
    elif choix == 4:
        ... action 4 ...
    else:
        pass # en fait ce cas n'arrive jamais grâce au 2e while

Ici on relit le choix (sans réaffichage du menu) jusqu'à ce qu'il ait
une valeur correcte.

C'est un peu embêtant parce qu'on teste le choix (dans les while) avant
de l'avoir lu (d'où les "choix = -1" pour faire au moins un tour de
boucle) ; c'est pour ça que "while True" avec des break est un peu plus
simple. D'autres langages ont une boucle "do ... while ..." pour ça,
mais pas Python.

Note que l'action "lire la valeur de choix" contient encore un while,
que tu peux garder comme il est dans ton code. Dans l'idéal, on pourrait
en faire une fonction, ton programme deviendrait :

choix = -1
while choix != 3:

    choix = lecture_d_un_choix_correct ()
    if choix == 1:
        ... action 1 ...
    ... etc.

et la logique affichage/lecture/vérification se retrouve cantonnée dans
la fonction.

-- Alain.

P/S: je laisse ton code original ci-dessous (il apparaît bien indenté
chez moi, sauf pour quelques commentaires)

> choix =""
> liste_elements = []
> liste_choix=[1,2,3,4,5]
> while True:
> #menu choix affiché
>     choix =""
>     print( )
>     print("--------------------------------")
>     print("Choisissez parmi les 3options suivantes :")
>     print("1: Ajouter un élément à la liste.")
>     print("2: Afficher la liste.")
>     print("3: Quitter.")
>     
> #test entrée est bien un chiffre
>     while True:  
>         try:
>             choix=int(input("Votre choix ?"))
>             break    
>         except ValueError :  
>             print("Erreur, votre choix doit etre un nombre!")   
>
> #test du nombre entré et option exécutée
>    
>     while choix in liste_choix:
>         if choix == 1 :
>             print("Choix 1, ajouter un élément")
>             ajouter=input("Votre ajout ?")
>             liste_elements.append(ajouter)
>             break
>         
>         if choix == 2 :
>             print("Choix 2, Afficher la liste")
>             print(liste_elements)
>             break
>        
>         if choix == 3:
>             print("Choix 3 , Quitter") 
>             break
>
>     Je cherche a quitter le premier while ( le menu )uniquement si j ai fini
> toutes les opérarions et pressant la touche 3
>
> merci de votre aide pour un retraité curieux, l identation n 'est pas visible
> dans mon message malgré sa perésence lors de la composition

Back to fr.comp.lang.python | Previous | NextPrevious in thread | Next in thread | Find similar


Thread

Sortir d 'une boucle while Cyrion81 <nospam_thy.prog@orange.fr.invalid> - 2022-01-30 18:29 -0600
  Re: Sortir d 'une boucle while Dominique <zzz@aol.com.invalid> - 2022-01-31 06:35 +0100
  Re: Sortir d 'une boucle while Benoit Izac <use.reply.to@INVALID.ADDRESS> - 2022-01-31 08:01 +0100
  Re: Sortir d 'une boucle while Alain Ketterlin <alain@universite-de-strasbourg.fr.invalid> - 2022-01-31 09:27 +0100
  Re: Sortir d 'une boucle while "Th.A.C" <aenleverraivac@free.fr.invalid> - 2022-01-31 23:25 +0100

csiph-web