Deutsch   English   Français   Italiano  
<87a6fcpaxy.fsf@universite-de-strasbourg.fr.invalid>

View for Bookmarking (what is this?)
Look up another Usenet article

Path: ...!news.nobody.at!weretis.net!feeder8.news.weretis.net!news.mixmin.net!aioe.org!Faqf6A55NG1s8DSVkh3L9A.user.46.165.242.75.POSTED!not-for-mail
From: Alain Ketterlin <alain@universite-de-strasbourg.fr.invalid>
Newsgroups: fr.comp.lang.python
Subject: Re: Sortir d 'une boucle while
Date: Mon, 31 Jan 2022 09:27:05 +0100
Organization: =?utf-8?Q?Universit=C3=A9?= de Strasbourg
Message-ID: <87a6fcpaxy.fsf@universite-de-strasbourg.fr.invalid>
References: <zM6dnZ5wDbXEsGr8nZ2dnUU7_8zNnZ2d@giganews.com>
Mime-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable
Injection-Info: gioia.aioe.org; logging-data="23115"; posting-host="Faqf6A55NG1s8DSVkh3L9A.user.gioia.aioe.org"; mail-complaints-to="abuse@aioe.org";
User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/25.2 (gnu/linux)
Cancel-Lock: sha1:ZSOAWVnEHW8CHN7Rj5lzQdAerQw=
X-Notice: Filtered by postfilter v. 0.9.2
Bytes: 5513
Lines: 136

Salut,

Comme l'a dit Beno=C3=AEt, le probl=C3=A8me est le dernier "while" :

>     while choix in liste_choix:
>         if choix =3D=3D 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 =3D=3D 1 :
        print("Choix 1, ajouter un =C3=A9l=C3=A9ment")
        ajouter=3Dinput("Votre ajout ?")
        liste_elements.append(ajouter)
        ## break # plus appropri=C3=A9
=20=20=20=20
    elif choix =3D=3D 2 :
        print("Choix 2, Afficher la liste")
        print(liste_elements)
        ## break # plus appropri=C3=A9
=20=20=20
    elif choix =3D=3D 3:
        print("Choix 3 , Quitter")=20
        break

    else:
        print("Mauvais choix , recommencez")

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

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

choix =3D -1
while choix !=3D 3:

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

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

Ici on relit le choix (sans r=C3=A9affichage du menu) jusqu'=C3=A0 ce qu'il=
 ait
une valeur correcte.

C'est un peu emb=C3=AAtant parce qu'on teste le choix (dans les while) avant
de l'avoir lu (d'o=C3=B9 les "choix =3D -1" pour faire au moins un tour de
boucle) ; c'est pour =C3=A7a que "while True" avec des break est un peu plus
simple. D'autres langages ont une boucle "do ... while ..." pour =C3=A7a,
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=C3=A9al, on pourra=
it
en faire une fonction, ton programme deviendrait :

choix =3D -1
while choix !=3D 3:

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

et la logique affichage/lecture/v=C3=A9rification se retrouve cantonn=C3=A9=
e dans
la fonction.

-- Alain.

P/S: je laisse ton code original ci-dessous (il appara=C3=AEt bien indent=
=C3=A9
chez moi, sauf pour quelques commentaires)

> choix =3D""
> liste_elements =3D []
> liste_choix=3D[1,2,3,4,5]
> while True:
> #menu choix affich=C3=A9
>     choix =3D""
>     print( )
>     print("--------------------------------")
>     print("Choisissez parmi les 3options suivantes :")
>     print("1: Ajouter un =C3=A9l=C3=A9ment =C3=A0 la liste.")
>     print("2: Afficher la liste.")
>     print("3: Quitter.")
>=20=20=20=20=20
> #test entr=C3=A9e est bien un chiffre
>     while True:=20=20
>         try:
>             choix=3Dint(input("Votre choix ?"))
>             break=20=20=20=20
>         except ValueError :=20=20
>             print("Erreur, votre choix doit etre un nombre!")=20=20=20
>
> #test du nombre entr=C3=A9 et option ex=C3=A9cut=C3=A9e
>=20=20=20=20
>     while choix in liste_choix:
>         if choix =3D=3D 1 :
>             print("Choix 1, ajouter un =C3=A9l=C3=A9ment")
>             ajouter=3Dinput("Votre ajout ?")
>             liste_elements.append(ajouter)
>             break
>=20=20=20=20=20=20=20=20=20
>         if choix =3D=3D 2 :
>             print("Choix 2, Afficher la liste")
>             print(liste_elements)
>             break
>=20=20=20=20=20=20=20=20
>         if choix =3D=3D 3:
>             print("Choix 3 , Quitter")=20
>             break
>
>     Je cherche a quitter le premier while ( le menu )uniquement si j ai f=
ini
> toutes les op=C3=A9rarions et pressant la touche 3
>
> merci de votre aide pour un retrait=C3=A9 curieux, l identation n 'est pa=
s visible
> dans mon message malgr=C3=A9 sa per=C3=A9sence lors de la composition