Path: ...!weretis.net!feeder6.news.weretis.net!feeder8.news.weretis.net!usenet.goja.nl.eu.org!aioe.org!Faqf6A55NG1s8DSVkh3L9A.user.46.165.242.75.POSTED!not-for-mail From: Alain Ketterlin Newsgroups: fr.comp.lang.python Subject: Re: print Date: Fri, 26 Nov 2021 14:04:05 +0100 Organization: =?utf-8?Q?Universit=C3=A9?= de Strasbourg Message-ID: <87pmqngjay.fsf@universite-de-strasbourg.fr.invalid> References: <61a08538$0$3730$426a34cc@news.free.fr> <875ysf1j6v.fsf@izac.org> Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Injection-Info: gioia.aioe.org; logging-data="39965"; 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) X-Notice: Filtered by postfilter v. 0.9.2 Cancel-Lock: sha1:4BwIDb9f7xgJgoXfurZLWNNjYJw= Bytes: 4050 Lines: 95 Benoit Izac writes: > Bonjour, > > Le 26/11/2021 =C3=A0 07:56, ast a =C3=A9crit dans le message > <61a08538$0$3730$426a34cc@news.free.fr>=C2=A0: > >> si je fais: >> >>>>> for i in range(5): >> i >> >> 0 >> 1 >> 2 >> 3 >> 4 >> >> j'ai bien l'affichage de i >> mais si je fais la m=C3=AAme chose dans une fonction: >> >>>>> def test(): >> for i in range(5): >> i >>=20=09=09 >>>>> test() >>>>> >> >> Je n'ai rien. Pourquoi ? > > J'imagine que dans le premier cas, i est renvoy=C3=A9 =C3=A0 chaque it=C3= =A9ration > =C3=A0 l'interpr=C3=A9teur, alors que dans le second cas, c'est renvoy=C3= =A9 =C3=A0 la > fonction et vu qu'elle ne renvoie rien, tu n'as rien. C'est =C3=A7a. La boucle REPL (read-eval-print loop) de l'interpr=C3=A9teur affiche toutes les valeurs des expressions qui sont ignor=C3=A9es dans l'ex=C3=A9cution de l'instruction ou l'=C3=A9valuation de l'expression sais= ie, en omettant None. Pour une instruction, cela concerne seulement les expressions directement evalu=C3=A9es, pas celles ignor=C3=A9es dans les ap= pels de fonction (ce serait trop compliqu=C3=A9 =C3=A0 faire -- l'ex=C3=A9cution de= s fonctions est la m=C3=AAme en mode interactif et en mode script). (Je me trompe peut-=C3=AAtre sur les d=C3=A9tails, ce comportement n'est = =C3=A0 ma connaissance pas document=C3=A9.) Dans le premier cas, l'instruction est la boucle for, et il y a 5 expressions ignor=C3=A9es (5 fois l'expression i). Il affiche donc 5 valeur= s. L'instruction for elle-m=C3=AAme n'a pas de valeur et ne provoque donc aucun affichage. Dans le deuxi=C3=A8me cas, la premi=C3=A8re instruction est le def (en enti= er), qui n'a pas de valeur, laquelle n'est donc pas ignor=C3=A9e, rien n'est affich=C3=A9. La seconde expression saisie est l'appel "test()" dont la valeur est None, qui n'est pas affich=C3=A9e. Le for n'est pas directement ex=C3=A9cut=C3=A9 dans le contexte de la boucle REPL, mais dans le contexte= d'un appel de fonction "normal". Si ta fonction =C3=A9tait def test(): for i in range (5): i return 42 tu verrais appara=C3=AEtre 42. (A mon avis, c'est typiquement le genre de fonctionnalit=C3=A9 inutilement trompeuse. L'interpr=C3=A9teur pourait tr=C3=A8s bien se contenter d'affich= er les valeurs des expressions saisies -- comme une calculatrice -- et ignorer les instructions.) On peut se demander pourquoi None n'est jamais affich=C3=A9 [*]. Je pense q= ue c'est =C3=A0 cause de print (qui renvoie toujours None -- je crois, ce n'est pas pr=C3=A9cis=C3=A9 dans la doc), parce que taper "print(42)" devrait aff= icher 42 (par ex=C3=A9cution de print) puis None (qui est la valeur de l'expression -- un appel est toujours une expression, il a toujours une valeur en Python). -- Alain. P/S: pour v=C3=A9rifier que None est effectivement explicitement ignor=C3= =A9 : for i in range (5): i if i % 2 =3D=3D 0 else None