Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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
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.
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
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
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é :
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