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


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

Re: print

Path csiph.com!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: print
Date Fri, 26 Nov 2021 14:04:05 +0100
Organization Université de Strasbourg
Message-ID <87pmqngjay.fsf@universite-de-strasbourg.fr.invalid> (permalink)
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=
Xref csiph.com fr.comp.lang.python:3651

Show key headers only | View raw


Benoit Izac <use.reply.to@INVALID.ADDRESS> writes:

> Bonjour,
>
> Le 26/11/2021 à 07:56, ast <ast@invalid> a écrit dans le message
> <61a08538$0$3730$426a34cc@news.free.fr> :
>
>> 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ême chose dans une fonction:
>>
>>>>> def test():
>> 	for i in range(5):
>> 		i
>> 		
>>>>> test()
>>>>>
>>
>> Je n'ai rien. Pourquoi ?
>
> J'imagine que dans le premier cas, i est renvoyé à chaque itération
> à l'interpréteur, alors que dans le second cas, c'est renvoyé à la
> fonction et vu qu'elle ne renvoie rien, tu n'as rien.

C'est ça. La boucle REPL (read-eval-print loop) de l'interpréteur
affiche toutes les valeurs des expressions qui sont ignorées dans
l'exécution de l'instruction ou l'évaluation de l'expression saisie, en
omettant None. Pour une instruction, cela concerne seulement les
expressions directement evaluées, pas celles ignorées dans les appels de
fonction (ce serait trop compliqué à faire -- l'exécution des fonctions
est la même en mode interactif et en mode script).

(Je me trompe peut-être sur les détails, ce comportement n'est à ma
connaissance pas documenté.)

Dans le premier cas, l'instruction est la boucle for, et il y a 5
expressions ignorées (5 fois l'expression i). Il affiche donc 5 valeurs.
L'instruction for elle-même n'a pas de valeur et ne provoque donc aucun
affichage.

Dans le deuxième cas, la première instruction est le def (en entier),
qui n'a pas de valeur, laquelle n'est donc pas ignorée, rien n'est
affiché. La seconde expression saisie est l'appel "test()" dont la
valeur est None, qui n'est pas affichée. Le for n'est pas directement
exécuté dans le contexte de la boucle REPL, mais dans le contexte d'un
appel de fonction "normal". Si ta fonction était

def test():
    for i in range (5):
        i
    return 42

tu verrais apparaître 42.

(A mon avis, c'est typiquement le genre de fonctionnalité inutilement
trompeuse. L'interpréteur pourait très bien se contenter d'afficher les
valeurs des expressions saisies -- comme une calculatrice -- et ignorer
les instructions.)


On peut se demander pourquoi None n'est jamais affiché [*]. Je pense que
c'est à cause de print (qui renvoie toujours None -- je crois, ce n'est
pas précisé dans la doc), parce que taper "print(42)" devrait afficher
42 (par exécution 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érifier que None est effectivement explicitement ignoré :

for i in range (5):
    i if i % 2 == 0 else None

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


Thread

print ast <ast@invalid> - 2021-11-26 07:56 +0100
  Re: print Benoit Izac <use.reply.to@INVALID.ADDRESS> - 2021-11-26 08:15 +0100
    Re: print Alain Ketterlin <alain@universite-de-strasbourg.fr.invalid> - 2021-11-26 14:04 +0100

csiph-web