Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

print

2 réponses
Avatar
ast
bonjour

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 ?

2 réponses

Avatar
Benoit Izac
Bonjour,
Le 26/11/2021 Í  07:56, ast a écrit dans le message
<61a08538$0$3730$ :
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.
--
Benoit Izac
Avatar
Alain Ketterlin
Benoit Izac writes:
Bonjour,
Le 26/11/2021 Í  07:56, ast a écrit dans le message
<61a08538$0$3730$ :
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