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

Incompréhension avec un générateur

2 réponses
Avatar
ast
bonjour

Quelque chose ne va pas avec le générateur donné en exemple sur ce site:
http://fr.openclassrooms.com/informatique/cours/apprenez-a-programmer-en-python/les-generateurs

Je reproduit le code ci-après:


def intervalle(borne_inf, borne_sup):

borne_inf += 1

while borne_inf < borne_sup:

valeur_recue = (yield borne_inf)

if valeur_recue is not None:

borne_inf = valeur_recue

borne_inf += 1


generateur = intervalle(10, 25)


for nombre in generateur:

if nombre == 15: # On saute à 20

generateur.send(20)

print(nombre, end=" ")

------------------------------------------------------------

L'auteur dit en commentaire "On saute à 20"
Je suppose qu'il s'attend à ce que son code fournisse comme résultat:
11 12 13 14 15 20 21 22 23 24

moi en lisant le code, je suis persuadé que le programme devrait fournir
11 12 13 14 15 21 22 23 24

or le programme fournit à l'execution
11 12 13 14 15 22 23 24

J'ai étudié en debug ce qui se passe exactement.

A chaque passage sur la ligne "for nombre in generateur:" on execute
un tour dans la boucle while de la fonction intervalle en s'arrêtant sur
la ligne contenant le yield.

mais quand on atteint 15, le programme principal appelle "generateur.send(20)"
et là surprise on fait de nouveau un tour dans la boucle while de la fonction
intervalle ! Je suppose que 21 est envoyé mais passe à la trappe.

Ce comportement me parait aberrant
Que faut il en penser ?

2 réponses

Avatar
Alain Ketterlin
"ast" writes:

def intervalle(borne_inf, borne_sup):
borne_inf += 1
while borne_inf < borne_sup:
valeur_recue = (yield borne_inf)
if valeur_recue is not None:
borne_inf = valeur_recue
borne_inf += 1

generateur = intervalle(10, 25)

for nombre in generateur:
if nombre == 15: # On saute à 20
generateur.send(20)
print(nombre, end=" ")



[...]
or le programme fournit à l'execution
11 12 13 14 15 22 23 24


[...]
mais quand on atteint 15, le programme principal appelle
"generateur.send(20)" et là surprise on fait de nouveau un tour dans
la boucle while de la fonction intervalle ! Je suppose que 21 est
envoyé mais passe à la trappe.



Il ne passe pas à la trappe, il est renvoyé par l'appel à se nd(). Si tu
écris (j'ai interverti le print et le test):

for nombre in generateur:
print(nombre)
if nombre == 15: # On saute a 20
print(generateur.send(20))

tu verras ce qui se passe.

-- Alain.
Avatar
ast
"Alain Ketterlin" a écrit dans le message de
news:

<
< for nombre in generateur:
< print(nombre)
< if nombre == 15: # On saute a 20
< print(generateur.send(20))

< tu verras ce qui se passe.
<
< -- Alain.

oui, j'ai vu. l'instruction generateur.send(20) provoque l'exécution
de la fonction generateur qui renvoie 21.

C'est surprenant car vraiment pas pratique ...

merci pour l'explication