Re: print

Liste des GroupesRevenir à fcl python 
Sujet : Re: print
De : alain (at) *nospam* universite-de-strasbourg.fr.invalid (Alain Ketterlin)
Groupes : fr.comp.lang.python
Date : 26. Nov 2021, 15:04:05
Autres entêtes
Organisation : Université de Strasbourg
Message-ID : <87pmqngjay.fsf@universite-de-strasbourg.fr.invalid>
References : 1 2
User-Agent : Gnus/5.13 (Gnus v5.13) Emacs/25.2 (gnu/linux)
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

Date Sujet#  Auteur
26 Nov 21 * print3ast
26 Nov 21 `* Re: print2Benoit Izac
26 Nov 21  `- Re: print1Alain Ketterlin

Haut de la page

Les messages affichés proviennent d'usenet.

NewsPortal